{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "KNN 用于分类：\n",
    "\n",
    "输出是离散值：KNN 在分类任务中通过找到目标点的 K 个最近邻居，然后让这些邻居为目标点“投票”来决定分类结果。通常，类别最多的那个类会被分配给目标点。\n",
    "常用场景：用于二分类或多分类问题，如鸢尾花分类、手写数字识别等。\n",
    "KNN 用于回归：\n",
    "\n",
    "输出是连续值：在回归任务中，KNN 会根据目标点的 K 个最近邻居的输出值进行平均，得到一个连续的数值预测。这与分类不同，不再是投票，而是对邻居的值取平均或加权平均。\n",
    "常用场景：用于预测连续值的问题，如房价预测、气温预测等。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "简单的knn模型\n",
    "1.导入数据\n",
    "2.训练模型\n",
    "3.数据预测\n",
    "4.输出结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "#构造或导入数据集\n",
    "x = [[1],[2],[34],[45]]\n",
    "y = [1,1,2,3]\n",
    "\n",
    "#训练模型\n",
    "abc = KNeighborsClassifier(n_neighbors=1)\n",
    "\n",
    "abc.fit(x,y)\n",
    "\n",
    "#数据预测\n",
    "a = abc.predict([[2]])\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "分类与回归的区别：\n",
    "模型导入：\n",
    "\n",
    "分类：KNeighborsClassifier\n",
    "回归：KNeighborsRegressor\n",
    "评估指标：\n",
    "\n",
    "分类：accuracy_score 用于计算分类的准确率。\n",
    "回归：mean_squared_error 用于计算回归的均方误差。\n",
    "数据集的目标：\n",
    "\n",
    "分类：分类数据集目标是离散的类别标签（如 iris 数据集的花的种类）。\n",
    "回归：回归数据集的目标是连续的数值（如 california_housing 数据集的房价预测）。\n",
    "模型对象：\n",
    "\n",
    "分类：KNeighborsClassifier 是用于分类任务的模型对象。\n",
    "回归：KNeighborsRegressor 是用于回归任务的模型对象。\n",
    "评估方法：\n",
    "\n",
    "分类使用准确率 (accuracy_score) 来衡量模型的表现。\n",
    "回归使用均方误差 (mean_squared_error) 来评估预测结果的误差。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "knn分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "分类准确率: 100.00%\n"
     ]
    }
   ],
   "source": [
    "# 导入所需库\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.datasets import load_iris\n",
    "# from sklearn.datasets import load_linnerud\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "# 加载数据集（以鸢尾花数据集为例）\n",
    "iris = load_iris()\n",
    "X = iris.data  # 特征数据\n",
    "y = iris.target  # 目标标签\n",
    "\n",
    "# 拆分数据集为训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n",
    "\n",
    "# 创建KNN分类器模型，选择K值为3\n",
    "knn = KNeighborsClassifier(n_neighbors=3)\n",
    "\n",
    "# 训练模型\n",
    "knn.fit(X_train, y_train)\n",
    "\n",
    "# 使用模型进行预测\n",
    "y_pred = knn.predict(X_test)\n",
    "\n",
    "# 评估模型准确率\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(f\"分类准确率: {accuracy * 100:.2f}%\")\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "knn回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "回归均方误差: 1.15\n"
     ]
    }
   ],
   "source": [
    "# 导入所需库\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.neighbors import KNeighborsRegressor\n",
    "from sklearn.datasets import fetch_california_housing\n",
    "from sklearn.metrics import mean_squared_error\n",
    "\n",
    "# 加载加州房价数据集\n",
    "california = fetch_california_housing()\n",
    "X = california.data  # 特征数据\n",
    "y = california.target  # 目标值（房价）\n",
    "\n",
    "# 拆分数据集为训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=29)#random_state是将训练集等分割情况不同，若删除可能会提高准确率\n",
    "\n",
    "# 创建KNN回归模型，选择K值为5\n",
    "knn_reg = KNeighborsRegressor(n_neighbors=5)\n",
    "\n",
    "# 训练模型\n",
    "knn_reg.fit(X_train, y_train)\n",
    "\n",
    "# 使用模型进行预测\n",
    "y_pred = knn_reg.predict(X_test)\n",
    "\n",
    "# 评估模型误差（均方误差）\n",
    "mse = mean_squared_error(y_test, y_pred)\n",
    "print(f\"回归均方误差: {mse:.2f}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "带有数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "分类准确率: 0.80\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 29305 (\\N{CJK UNIFIED IDEOGRAPH-7279}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24449 (\\N{CJK UNIFIED IDEOGRAPH-5F81}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20998 (\\N{CJK UNIFIED IDEOGRAPH-5206}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 31867 (\\N{CJK UNIFIED IDEOGRAPH-7C7B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20915 (\\N{CJK UNIFIED IDEOGRAPH-51B3}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 31574 (\\N{CJK UNIFIED IDEOGRAPH-7B56}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 36793 (\\N{CJK UNIFIED IDEOGRAPH-8FB9}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30028 (\\N{CJK UNIFIED IDEOGRAPH-754C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20934 (\\N{CJK UNIFIED IDEOGRAPH-51C6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30830 (\\N{CJK UNIFIED IDEOGRAPH-786E}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 29575 (\\N{CJK UNIFIED IDEOGRAPH-7387}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 35757 (\\N{CJK UNIFIED IDEOGRAPH-8BAD}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 32451 (\\N{CJK UNIFIED IDEOGRAPH-7EC3}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38598 (\\N{CJK UNIFIED IDEOGRAPH-96C6}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 27979 (\\N{CJK UNIFIED IDEOGRAPH-6D4B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "d:\\anaconda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 35797 (\\N{CJK UNIFIED IDEOGRAPH-8BD5}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAIhCAYAAABdSTJTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACtlElEQVR4nOzdd3wURRvA8d/upYc0QgklCb33DtKkF0WqSpEqTZFeBOldBAUL2AUUxJfeFaRKCR2k9w4BQiAF0u523z8uRFKA9Lskz/fzOSWzs7PP3d7mnszNzii6rusIIYQQQgiRAamWDkAIIYQQQojkkmRWCCGEEEJkWJLMCiGEEEKIDEuSWSGEEEIIkWFJMiuEEEIIITIsSWaFEEIIIUSGJcmsEEIIIYTIsCSZFUIIIYQQGZYks0IIIYQQIsOSZFYIIYQQQmRYkswKkUUsXLgQRVE4fPhwrPKAgACqVKlCtmzZ2Lp1KwATJ05EURRy5cpFSEhIvLYKFCjAG2+8EatMURQURWHmzJmJPvbznjx5gru7+0sf27ZtyzT1XuXy5cvY29uzf//+mLLu3buTLVu2eHUPHTpEjhw5KFasGNevX39l2y/zySefULFiRbJnz46DgwOFChWiT58+8drdtm0b2bJl4/bt28k+VuHChV/6Ov3yyy9pUi85vvrqK0qUKIG9vT0FCxZk0qRJREVFJWrfS5cu8d577+Hj44OjoyOFCxdm6NChPHz4MF7dK1eu0LZtW9zd3cmWLRuNGzfm6NGjyY5biKzAxtIBCCEs59atWzRu3Jh79+7x999/U6NGjVjbHzx4wKxZs5gyZUqi25w5cyZ9+vQhe/bsSYpF13WyZcvGrVu3EtzepUsXoqKiMk29Vxk+fDiNGzemZs2aL623Y8cO3nrrLQoXLsxff/1Frly5Xtn2yzx+/JiOHTtSsmRJXFxcOHPmDFOnTmXdunWcPn0aT09PABo2bEi1atUYM2YMixYtStaxgoKCCAgIwMYm/kfR2LFjiYiISJN6STVt2jTGjRvHxx9/TJMmTTh06BBjx47l9u3bfP/99y/d98GDB9SoUQNXV1emTJmCj48Px44dY8KECezYsYMjR46gqmpM3Tp16uDh4cHPP/+Mg4MDM2bMoH79+hw6dIjixYsnK34hMjtJZoXIoi5evEijRo2Iiopi165dlC1bNl6dZs2a8cUXX/Dhhx/i5eX1yjYbNWrEzp07mTZtGnPmzEmLsLOEs2fPsmbNGv7888+X1lu7di3vvPMOVatWZcOGDbi5uaX42N98802sn+vXr0/BggVp0aIFa9eupWfPnjHbPvzwQ9555x2mTp2Kt7d3io9tjR4+fMjUqVPp3bs306dPB8yvSVRUFGPHjmXw4MGUKlXqhfuvXbuWhw8f8scff9CwYUMAXn/9dSIiIhgzZgwnTpygYsWKAHz22Wc8ePCAffv24evrC0Dt2rUpXLgw48eP548//kjjZytExiTDDITIgo4fP07t2rWxsbFhz549CSayAFOnTsVoNDJx4sREtVu8eHF69erFN998k+Kvu7OyBQsW4OXlRePGjV9Y59dff6V9+/Y0aNCALVu2pEoi+yI5c+YEiNfj+eabb5ItWzZ++OGHNDu2pf3555+Eh4fTo0ePWOU9evRA13XWrFnz0v1tbW0B4p0fd3d3ABwcHGLKVq9eTYMGDWISWQBXV1fatm3L+vXrMRqNKXgmQmRekswKkcXs2bOH+vXrkytXLvbs2UOhQoVeWNfX15cPPviAn376iQsXLiSq/YkTJ2IwGBg3blxqhZzlbNy4kbp168Z8/RzXl19+Sbdu3Wjfvj1r167F0dExXh1N0zAaja98mEymBI9hNBoJCwvj2LFjDB48mGLFitG2bdtYdezs7KhVqxYbN25M+ZNOZ/Xr10dRlFfWO3XqFEC8P/jy5MlDjhw5Yra/SOvWrfHx8WHYsGGcPn2a0NBQdu/ezcyZM3nzzTcpWbIkAGFhYVy+fJly5crFa6NcuXKEhYVx5cqVxD49IbIUSWaFyGKGDBkCwPbt28mTJ88r63/yySc4OzszZsyYRLXv5eXFkCFDWLJkCf/++2+KYs2K7t+/z5UrV6hUqVKC2588ecKgQYN47bXXWLJkSUzPX1w9e/bE1tb2lY9nX30/z9/fH1tbW5ycnKhUqRJGo5EdO3YkePNZpUqVOH78OE+ePEnZE09nBoMBg8HwynoPHz7E3t4eZ2fneNuyZ8+e4E1cz3Nzc8PPz4+oqCjKlCmDi4sL9erVo3r16ixfvjym3qNHj9B1PcGx5s/KXnUsIbIqSWaFyGJatWpFUFAQgwcPfmGv3PM8PT0ZNWoUK1eu5MCBA4k6xsiRI8mePTujRo1KabhZzp07dwBeeCOXo6MjjRs3Zu/evXz77bcvbGfixIkcOnTolY/vvvsu3r45cuTg0KFD7Nmzhx9++IHAwEBef/117t69G69urly50DQNf3//ZD5jy9i2bVuiv7Z/WQ/uq3p3Hz16xFtvvUVwcDBLlixh9+7dzJ8/nz179tCqVat4MaTkWEJkVXIDmBBZzLhx46hQoQKTJ09G0zR+++23V/ZQDR48mK+//pqRI0eya9euVx7D1dU15uaYHTt2pFboWUJYWBgQeyzl81RVZd26dbz11lt8+OGH6LrOhx9+GK+ej48P+fPnf+XxEkqQbGxsqFKlCgCvvfYazZo1o2DBgsycOZN58+bFqvsszmdxZzaenp6Eh4fz9OlTnJycYm0LDAykcuXKL93/008/5fjx41y/fj3mm5A6depQokQJGjRowJIlS+jWrRseHh4oipJg72tgYCBAkmcIESKrkJ5ZIbKgSZMmMWHCBJYtW0anTp1e2UPl6OjIxIkT2b17d6LHR/bv35+CBQsyatQodF1PjbCzhBw5cgD/JTAJcXBwYO3atTRr1owBAwbw1VdfxauTkmEGceXPn5+8efMmOG76WZzP4s5sno2VPXnyZKxyf39/AgICKFOmzEv3P378OPny5Ys3pKdq1arAf2NyHR0dKVKkSLzjPDu2o6PjS8e3C5GVSc+sEFnUxIkTUVWVCRMmoOs6S5cuTXB+zmd69uzJF198wccff4ymaa9s387OjqlTp9K5c+dMm+ikBV9fXxwdHbl8+fJL6zk4OLBmzRratGnDwIED0TSNQYMGxWyfOHEiAwYMeOXxXFxcXlnn0qVL3Lp1i1atWsXbduXKFTw9PcmdO/cr28mImjVrhoODAwsXLqR69eox5c8WAmnduvVL98+bNy/btm3j9u3b5MuXL6b82WIYz/eet2nThrlz53Lz5s2Yqc5CQkJYtWoVrVq1eun1KURWJleGEFnY+PHjUVWVcePGoes6v//++ws/MA0GA9OnT6dNmzYACd51HVfHjh2ZPXs2mzdvTtW4MzM7Oztq1qyJn5/fK+va29uzevVq2rVrx+DBg9E0LeYGvwIFClCgQIEkHfvff/9lyJAhtG/fnkKFCqGqKidPnuSLL77A09OT4cOHx9vHz8+PevXqxRqusHDhQnr06MEvv/xC9+7dkxRDemnYsCG7du165bcS2bNnZ+zYsYwbN47s2bPHLJowceJE3n///VhzzC5evJiePXvy888/07VrV8A8F++SJUto3LgxH3/8Md7e3pw6dYqpU6eSO3duOnfuHLP/8OHD+fXXX2nZsiWTJ0/G3t6emTNnEh4enujp8YTIiiSZFSKLGzt2LKqq8sknn6BpGsuWLXth3datW1OrVi327duXqLYVReHTTz+lSZMmqRVultC5c2f69OnD3bt3XznjhL29PatWraJ9+/YMHToUTdMYNmxYso6bO3du8ubNy5w5c7h79y5Go5H8+fPzxhtvMGbMmHgLI1y+fJmTJ0/GS7RCQ0MBEjVbhqWYTKZE3QAJ5hk9XFxc+Oabb5g9ezZeXl58/PHHfPLJJ7HqaZqGyWSK9c1F5cqV8fPzY8qUKXzyySc8ePCAfPny0apVK8aPHx/rW4ucOXPyzz//MHz4cLp164bRaKRmzZrs3LmTEiVKpM4TFyITkmRWiCyie/fuL+wlGzNmTKyptyZOnPjCnqC9e/cmWP6icbGNGzeWMbNJ1KlTJz7++GMWL14ca0aIhQsXsnDhwnj17ezsWLduXYqPmzt3bn799ddE11+4cCE+Pj7xhh/s3r2bKlWq0LRp0xTHlFZ27tyZpPoDBw5k4MCBL63zomusYsWKrFq1KlHHKVy4MKtXr05SbEJkdXIDmBBCWBkHBwcmTZrE559/brXztz5+/JhvvvmG6dOnxxqaout6zJLGQgiRHqRnVghhFRRFISgoKGaZz7g0TaN79+6Zpt6r9OnTh8ePH3PlypUXLjdsSVevXmX06NF06tQpVrmiKNy/fz9RbWTLlu2FNwdqmsYXX3yRJvWEEJmLosv3f0IIIYQQIoOSYQZCCCGEECLDkmRWCCGEEEJkWFluzKymady5cwcXFxdZ51oIIYQQwgrpuk5ISAh58+ZFVV/e95rlktk7d+7EmytRCCGEEEJYn5s3b8ZaKS8hWS6ZfbZ0480FC3B1dLRwNEIIITK61W2e/UcIkVrCwoLp3987UUtuZ7lk9tnQAldHR1ydnCwcjRBCiIxseQdwWt4B5ONEiDSRmCGhcgOYEEIIkQzLOzz7jxDCkiSZFUIIIYQQGZYks0IIIYQQIsPKcmNmhRBCCCHSno6qGjEYTJYOxGoZjbbouiHF7UgyK4QQQgiRigyGSLJnv4uz81NkSvsXMxoV7t/PT0REthS1I8msEEIIIUSq0ciT5youLgbc3fNiY2MHSEYbn05w8APgFrduFU1RD60ks0IIIYQQqcTGJhJbWw1PT2/s7WXOtpdxdc1JcPA1bGyiiIpKfjIrN4AJIYQQSSTTcokXeTasQFEkxXq11OmxlldaCCGESAJJZIWwLpLMCiGEEEkhiawQVkWSWSGEEEIIkWHJDWBCCCGEEFncwYP7GDHigwS3NWjQjOPHDxMYGJDg9q1bD/LLL9+ydOnPCW4fNmwsrVq1T7VY45JkVgghhBDCCoWFhXHu3Gnc3NwpVKhImh4rJCSYFi1aM2rUxFjlN25cY/Lkj3nyJJRdu47H269Vq/pomoa//x2mTZtL7dr1Y21funQhDx8mnASnFhlmIIQQQiSSDJcV6UHXdebP/5zSJXLTqFFVqlYtStNGVbl48bylQ7NKkswKIYQQiSCzGIj0snTpL4wbN4zOoSEcAFYCof8eo22reoSGhlo6PKsjyawQQgiRGJLIinTy1RczaAd8A1QD2gKbTCb8799n1arfLRucFZJkVgghhBDCSphMJi5evUSzOOUFgWK2Npw9e8oSYVk1SWaFEEIIIayEwWAgb87cHIpTHgBcNZnw9va1RFhWTZJZIYQQQggr0rPvIH5SFL4EgoDTwDuqip2DA2+//Z6Fo7M+kswKIYQQQliRgQNH0uW99xmsKLgDZYBT7h789vtGcuTIaeHorI/MMyuEEEIIYUUMBgOff/E9gwaP5sCBvbi7e1C/fmPs7OwsHZpVkmRWCCGEEMIK+foWxNe3oKXDsHoyzEAIIYR4heXItFxCWCvpmRVCCCFeQhJZkRW4urrx118b+OuvDfG2NWjQlKCgxzRoUCXBfVVVJW/e/IwfPzzB7UOGjEnVWOOSZFYIIYR4AfOqX5aOQoi0V7VqTbZvP5zs/Xv3HkDv3gNSMaLEk2EGQgghhBAiw5JkVgghhBBCZFiSzAohhBBCiAxLklkhhBBCCJFhSTIrhBBCCCEyLElmhRBCCCFEhiXJrBBCCCGElTIajei6bukwrJrMMyuEEEIIYYVMJhNVqxejf98h9OnzUZoe6+DBfYwY8UGC2xo0aMbx44cJDAxIcPvWrQf55ZdvWbr05wS3Dxs2llat2qdarHFZtGd24sSJKIoS6+Hl5fXSfXbt2kXlypVxcHCgUKFCfPvtt+kUrRBCCCFE+vHz28ONa1dZ8sdPaX6skJBgWrRoza5dx2M9fv11DTdvXuPJk9B423btOo6bmzuapuHvf4dp0+bG296372AePkw4CU4tFh9mULp0ae7evRvzOHny5AvrXr16lRYtWlCnTh2OHTvGmDFjGDhwICtXrkzHiIUQQggh0t769eb85tTxE9y4cc2ywVgxiw8zsLGxeWVv7DPffvstPj4+zJ07F4CSJUty+PBhZs+eTbt27dIwSiGEEEKItLVr1za+//7LmJ/37t8J3UH9XaV79/bkyZMPAHd3D+bO/QFbW1vLBGplLJ7MXrx4kbx582Jvb0/16tWZPn06hQoVSrDu/v37adKkSayypk2b8tNPPxEVFZXgSY2IiCAiIiLm5+Dg4NR9AkIIIYQQqSAiIpxtOzYTFREFJYHXgVGgldY4seMIJ7YdgQgoW7ECmqZZOlyrYdFhBtWrV2fx4sX89ddf/PDDD/j7+1OrVi0ePnyYYH1/f39y584dqyx37twYjUYCAhIejzFjxgzc3NxiHt7e3qn+PIQQQgghUqpJk5b8veUQhYoWQb2mwntACWAQqIoKEfDBB0P5a6Mf9vb2lg7Xalg0mW3evDnt2rWjbNmyNGrUiI0bNwKwaNGiF+6jKEqsn59NVxG3/JnRo0cTFBQU87h582YqRS+EEEIIkbrKlCnPzm3HcbRxhG3AKeAB6H/pfPTRCKZMmSOJbBwWH2bwPGdnZ8qWLcvFixcT3O7l5YW/v3+ssvv372NjY4Onp2eC+9jb28tJF0IIIUSGcenSeZ6EPIHjQFkw+Npg8jJy6JifpUOzShafzeB5ERERnD17ljx58iS4vWbNmmzdujVW2ZYtW6hSpYoMghZCCCFEpvBsFgPDQQMffzyJil5V4BYc2LeHgIAHFo7O+lg0mR0+fDi7du3i6tWrHDhwgPbt2xMcHEy3bt0A8xCBrl27xtTv168f169fZ+jQoZw9e5aff/6Zn376ieHDh1vqKQghhMiklnd49h8h0teJf4/gXdCXPzfvZ8SI8Wxc9w8jRoxHQeHkyeOWDs/qWHSYwa1bt+jYsSMBAQHkzJmTGjVq4Ofnh6+vLwB3797lxo0bMfULFizIpk2bGDJkCN988w158+blyy+/lGm5hBBCpCpJZIUl/fTjH9jZ2ePg4ACYpzH9+ONJ9Or1ITly5LRwdNbHosnssmXLXrp94cKF8crq1avH0aNH0ygiIYQQQgjLcnV1S7A8Z85c6RxJxmBVN4AJIYQQQoj05+rqxl9/beCvvzbE29agQVOCgh7ToEGVBPdVVZW8efMzfnzCwz6HDBmTqrHGJcmsEEIIIUQWV7VqTbZvP5zs/Xv3HkDv3gNSMaLEs6rZDIQQQgghhEgKSWaFEEIIIVKdbukAMoDUeY0kmRVCCCGESCVGoy2aBhERTy0ditUzGiPRdTCZDClqR8bMCiGEEEKkEl03EBTkjo3NfQDs7Z0AxbJBWSFd13j8+AFPnjihaSlLRyWZFUIIIYRIRY8fewFgNN5Hle/AXygqSiUw0IeUJvuSzAohhBBCpCqFx4/zEBSUCxubKEsHY5V0HYxGO1JjxKsks0IIIYQQaUDXDURFpWw8qHg16fwWQgghhBAZliSzQgghhBAiw5JkVgghhBBCZFiSzAohhBBCiAxLklkhhBBCCJFhSTIrhBBCCCEyLElmhRBCCCFEhiXJrBBCCCGEyLAkmRVCCCGEEBmWJLNCCCHEc5Z3ePYfIURGIMmsEEIIEU0SWSEyHklmhRBCiGckkRUiw5FkVgghhBBCZFiSzAohhBBCiAxLklkhhBBCCJFhSTIrhBBCCCEyLElmhRBCCCFEhiXJrBBCCCGEyLAkmRVCCCGEEBmWJLNCCCGEECLDkmRWCCGEEEJkWJLMCiGEEEKIDEuSWSGEEEIIkWFJMiuEEEIIITIsSWaFEEIIIUSGJcmsEEIIIYTIsCSZFUIIIYQQGZYks0IIIYQQIsOSZFYIIYQAlnewdARCiOSwsXQAQgghhKUtpwMst3QUQojkkJ5ZIYQQQgiRYUkyK4QQQgghMixJZoUQQgghRIZlNcnsjBkzUBSFwYMHv7DOzp07URQl3uPcuXPpF6gQQgghhLAaVnED2KFDh/j+++8pV65couqfP38eV1fXmJ9z5syZVqEJIYQQQggrZvGe2dDQUDp37swPP/yAh4dHovbJlSsXXl5eMQ+DwZDGUQohhBBCCGtk8WT2ww8/pGXLljRq1CjR+1SsWJE8efLQsGFDduzY8dK6ERERBAcHx3oIIYQQQojMwaLDDJYtW8bRo0c5dOhQournyZOH77//nsqVKxMREcGvv/5Kw4YN2blzJ3Xr1k1wnxkzZjBp0qTUDFsIIYQQQlgJiyWzN2/eZNCgQWzZsgUHB4dE7VO8eHGKFy8e83PNmjW5efMms2fPfmEyO3r0aIYOHRrzc3BwMN7e3ikLXgghhBBCWAWLDTM4cuQI9+/fp3LlytjY2GBjY8OuXbv48ssvsbGxwWQyJaqdGjVqcPHixRdut7e3x9XVNdZDCCGEEEJkDhbrmW3YsCEnT56MVdajRw9KlCjBqFGjEn1T17Fjx8iTJ09ahCiEEEIIIaycxZJZFxcXypQpE6vM2dkZT0/PmPLRo0dz+/ZtFi9eDMDcuXMpUKAApUuXJjIykt9++42VK1eycuXKdI9fCCGEEEJYnlXMM/sid+/e5caNGzE/R0ZGMnz4cG7fvo2joyOlS5dm48aNtGjRwoJRCiGEEEIIS1F0XdctHUR6Cg4Oxs3NjaCFC3F1crJ0OEIIK2PSNFYdOMDKAweIMhppXrEiXerUwcHOztKhiTSynA6WDkEIEcfTp8F07+5GUFDQK+93suqeWSGESE8mTeOdzz9n5cGDVFVVHHWdPgcP8tPff/P3hAk4J3LmFZExLO/w7D9CiIzM4osmCCGEtVi+fz8rDx5kFXBQ09il6/gBx65cYe6mTZYOTwghRAIkmRVCiGjL9++npqLQ5rmyakAHXWf5nj2WCksIIcRLSDIrhBDRIqKiyJbAbQTZorcJIYSwPpLMCiFEtGYVK7IdOPFc2R3gf6pKs8qVLRSVEEKIl5FkVgghovWoX5+y3t68pqq8DwwEyqsqTq6ujGjVytLhidQmN38JkSnIbAZCCBHN2cGBnVOmMHvdOlbs3UuUyUTHKlUY1bo1ebNnt3R4IhXJdFxCZB6SzAohxHPcnJyY8u67THn3XUuHItKIJLJCZC6SzAohhMjUZD5ZITI3GTMrhBAi05JEVojMT5JZIYQQmZIkskJkDZLMCiGEyHQkkRUi65BkVgghRKYiiawQWYsks0IIITINSWSFyHokmRVCCJEpSCIrRNYkU3MJIYTI8JbTAZZbOgohhCVIz6wQQogMTRZBECJrk2RWCCFEhiWJrBBCklkhhBAZkiSyQgiQZFYIIUQGJImsEOIZuQFMCJEhRRmNrD18mO2nTuFkZ0fH2rWpXKiQpcMSaSTWJAUyY4EQ4jmSzAohMpzQ8HCaTZnC3osXKWUw8AiYs2ED49u3Z9Lbb1s6PJHKZMotIcTLSDIrhMhwpq9axbFLl9gF1DWZMAIzgPErVtC8QgVqFCtm4QhFSklPrBAisSSZFUJkOEt27aK7rlM3+mcbYAzwg8HAkj17JJnN4KQnVgiRFHIDmBAiwwkOC8MrTpkByK3rhISFWSIkkZokkRVCJIEks0KIDOf1smVZqqo8n7YeAw5rGvVLl7ZUWEIIISxAklkhRIYzrn17bhgMVFVVZgGjgAaqSnlvb96tVcvS4YkUkE5ZIURSSTIrhMhwKhYsyO4pUyhQrhwTbGz4ycmJ95o0YfukSTjY2Vk6PJFMMlZWCJEccgOYECJDqlyoEBvGjLF0GCKVSCIrhEguSWaFEEJY1HI6wHJLRyGEyKhkmIEQIlk0TSMkLAxN0ywdisjAZFlaIURKSc+sECJJNE3js3XrmLdhA3eDg8nt4sJHLVvycevWGFT5+1gkniSyQojUIMmsECJJPl6yhNnr19MbqA/8ExLC+GXLuB8UxLwePSwcncgoJJEVQqQWSWaFEIkWEBzMvE2bmABMiC7rCPgA4/76i9Ft2uDl7m6x+IT1khu8hBBpRb4TFEIk2rFr14g0megcp7wTYNQ0Dl++bImwhJWTRFYIkZYkmRVCJJpntmwAXIlTfvXZdheXdI1HWD9JZIUQaU2SWSFEolUsWJCy+fIxXFV51gd7DRiiqhTPnZvqRYpYMDphbSSRFUKkBxkzK4RINEVR+H3oUJpMnkzRoCC8DQZumUzkdHbmr2HDUGU2gywvVu4qiawQIh1IMiuESJLS3t5c/Pprlu/fz/k7dyji5cU7tWrh7OBg6dCEhUlPrBDCEiSZFUIkmZO9Pd3q17d0GMKKSCIrhLAUSWaFEEKkiCxHK4SwJKsZ4DZjxgwURWHw4MEvrbdr1y4qV66Mg4MDhQoV4ttvv02fAIUQIgG3Hj7k8w0bmLR8ObvPnEHXdUuHJIQQWYpV9MweOnSI77//nnLlyr203tWrV2nRogW9e/fmt99+Y+/evXzwwQfkzJmTdu3apVO0Qghh9uO2bfT/4QdsdB1nRWHi8uW0rFCBFcOH42BnZ+nwhBAiS7B4z2xoaCidO3fmhx9+wMPD46V1v/32W3x8fJg7dy4lS5bk/fffp2fPnsyePTudohVCCLNzt2/T9/vv6alp3Nd1Hmgaq4C/T5xgxpo1lg5PCCGyDIsnsx9++CEtW7akUaNGr6y7f/9+mjRpEqusadOmHD58mKioqAT3iYiIIDg4ONZDCCFSavGuXXgoCl8CLoACtAF66jq//P23ZYMTQogsxKLJ7LJlyzh69CgzZsxIVH1/f39y584dqyx37twYjUYCAgIS3GfGjBm4ubnFPLy9vVMctxBCBISE4KMo2McpLwI8CA21REgWIRMYCCEszWLJ7M2bNxk0aBC//fYbDkmYn1JRlFg/P7vZIm75M6NHjyYoKCjmcfPmzeQHLYQQ0aoXLcpxk4mzz5WZgP8pCjWKFrVUWOlKpuMSQlgDi90AduTIEe7fv0/lypVjykwmE7t37+brr78mIiICg8EQax8vLy/8/f1jld2/fx8bGxs8PT0TPI69vT329nH7ToQQImU6vvYas1avpuGDBwzTNHIDPysKh4CtHbJIgieJrBDCClgsmW3YsCEnT56MVdajRw9KlCjBqFGj4iWyADVr1mT9+vWxyrZs2UKVKlWwtbVN03iFEOJ5Tvb27Jg0iaGLFvHxgQMYNY0K+fOzoUsXGpQpY+nwhBAiy7BYMuvi4kKZOL/wnZ2d8fT0jCkfPXo0t2/fZvHixQD069ePr7/+mqFDh9K7d2/279/PTz/9xO+//57u8QshRN7s2Vk2ZAjhkZGER0Xh7uxs6ZCEECLLsfhsBi9z9+5dbty4EfNzwYIF2bRpEzt37qRChQpMmTKFL7/8UuaYFUJYlIOdnSSyQghhIYqexZarCQ4Oxs3NjaCFC3F1crJ0OEIIkSHJzV9CiLT09Gkw3bu7ERQUhKur60vrWsUKYEIIAfD1n38y6Y8/ePTkCTaKQvUSJVg7YgTu2bJZOjTxHElkhRDWxKqHGQghso5Za9Yw8Oefyf/kCdOBHrrO/rNnKT5wIJqmWTo8EU0SWSGEtZFkVghhFaatWEFN4BAwElgArADuh4Yyd+NGi8YmhBDCekkyK4SwuPtBQQRHRvI+scc+vQl4AqsPHrRMYEIIIayeJLNCCItzsrdHAe7HKX8KPAGyOTqmf1BCCCEyBElmhRAWl83BAd8cOZgDMcvDRgGjgXBgdOvWlgpNCCGElZNkVghhFVaPHEmowUBpoALgBXwFdKhRg7qlSlk0NmEmN38JIayRTM0lhLAKFQoU4MZ33zFs8WL2X7xIYScnfmzdmjbVq1s6NIEkskII6yXJrBAihqZpHLh0iZrFilnk+DlcXVk0YIBFjh1XSFgYUSYT2WWOWyGEsGoyzEAIEePjpUupNXYs206etHQoFtf7229pOnmypcMQQgjxCtIzK4QAwGgy8cv27QCM+f13/MqUQVEUC0dlGU/Cw1l36BBhRiOX/f0p7OVl6ZAsSoYYiPQQGRnO0aMbCQkJoEiRahQsWDFV2tU0jdOnd3D37kW8vApTpkxDVFX68jITSWaFEJy+eZPmU6cSGBqKLXD00iXqjB3L2o8/xtPFxdLhpbs/jx8nzGjEVlFYeeAAI996y9IhWYwksiI9nDu3h1mz2hEaeh9QAJ1KlVoxZMjv2Ns7Jbvdhw9vMW3aG9y6dSKm3bx5SzNmzAZy5SqQOsELi1N0XdctHUR6Cg4Oxs3NjaCFC3F1Sv4FIkRmUKB/fwIeP8ZoMqFhng5rEjABsANURcGgqlQvUYJtEyZYNNa0dOXePTrMnk14RAQA90JCyBcWRmFNY5uDA/nd3QEwGAx8268ftYoXt2C06UcSWZEenj4Npn//AoSHl0PXvwcKAStQlF40a/Y+PXrMS3bbY8fW4dKlG2jar0AdYD+q+h6+vp7MnHkgy377lBE8fRpM9+5uBAUF4erq+tK60s8uRBbmkzMnT0wmIoAOwFzMS8l+AtQHwnWdMJOJMj4+lgsyHXi6uGBnY8MZf3/8/f3p/OQJ8zSNSUCv8HCe+vtzxt+f8Kgo8np4WDrcdCGJrEgvfn7LCQsLQteXAMUwf2n8Lro+hG3bfsZojExWuzdvnubChT1o2lygLuae2Vpo2pdcvXqIa9eOp9IzEJYmyawQWdjuyZNpVbkyNsBWoBXgALwO7MT8kfJZ167M69HDckGmAzcnJ3ZPmcKYNm14BFxVVeoDZaO3XwN61K/P0dmzKZArl6XCTDeSyIr09PDhLQyGHEC+OFsqEhkZytOnwclqNzDwdvS/ysfZUiHmuCJzkDGzQmRx49q3Z92RIzwAbgN+mJeRjQTsDQZ6N2xo0fjSi62NDdM6duTCnTucPnyY40AQcFFRqOTjw88ffGDhCNPWcjo8/4MQ6cbXtzwm033gEFD1uS3rcXf3Jlu27Mlq19u7DIpiQNc3AAOf27IBUPDxKfuCPUVGI8msEFlclcKFcbSzQ4uM5G3gLlA4elvB3LlxcXS0YHTpK8poZNu//+JmMlFVUTDqOkV0ncvXr+P/+DFe0WNnM5tYiawQ6axy5TfIm7cM/v6t0bRJQFHgD2ARbdt+leyZB7Jnz0vdul3ZvXskuh6MefDUHhRlMjVrdpQbwDIRGWYgRBb3NDycqMhIIoD70WXXo/9///FjywRlITtOn+ZRWBjXgeFvvcW87t25YTCgA6sPHrR0eGlCEllhaQaDDRMmbKF8+UpAH6A+Tk7/4733ZtO06YcpartPnwU0adIbG5tpQB0Mhok0bNiVDz74MTVCF1ZCemaFyOKuPniACahfqhRLBw0yT89lMNB82jRuBwZaOrx0dTswkPweHiwcMICGZc1fQdYrVYrO8+Zx6+FDC0eX+iSRFdbCwyMPo0ev5/Hje4SGPiR37sLY2tqnuF1bW3t69fqKjh2n8fDhTTw98+Pk5JYKEQtrIlNzCSHQNA1VVbn76BGfrVvHzM6dsbOxiSlPbxP/9z/a1ahB2XSeReHZr8O40/W8qDyjkRu7hBAZhUzNJYRIkmcJ64/btvHFxo38/e+/scrT07nbt5m0YgVz1q9P92MripJgwvqi8oxEElkhRGYlyawQIsbKffsAWOHnl2pt+l24QPvZsynSvz/1xo1j6Z49vOwLoZUHDgCw7uBBoozGVIsjK5NEVgiRmcmYWSGysNM3b3IjIACAR0+ecOLWLcoAaw8cYFONGjG9kWV9fMjv6Znk9jccOULrWbMorii00TROBAbS+fx5Tt24wfROnQB4GBLCwUuXYvb5ffduygCnwsL4cvNmSuXPD0AOFxeqFimSsiecBUkiK4TI7GTMrBBZWIlBgzh/927Mz+6KwmZdpxbw/C+Gjq+9xtJBg5LUtqZpFP/oIwo/eMAG/vvLeSowQVG4+s03+OTIwbhly5i6alWsfdcAo1WVs5oWU+ZoZ8fjhQuxs5G/wRNLElkhREYlY2aFEImydtQoKkbfZDUMuK7r1ABuAa2j67SuUoWvevZMctuX793j0oMHDCT2V0CDMd9Q9dfx4wCMaduW/o0bA1ATOAe8BRzRND4HbIECnp5sHz9eEtkkkERWCJFVSDIrRBZWPG9e9s+YQZ9GjZgDnIguX465d/Srnj1ZNWIEni4uSW7b1mAAICxOeTjmXt9niamjnR3ze/dm9fDhHDEY+Ca63iNgKNC0UiWOz5lDjWLFkhxDVrO8w38PSWSFEFmFdHMIkcXZ29pSMl8+7BQFP11nsKLQOnr0UXlf32Tfxe+bMyeVfX2ZcfMmjTQNN8AEjMW8TG7LSpVi1a9SuDCRJhN2QC1VpYmmkUdVKZgrF24yJOiVltNBlqEVQmRJ0jMrhGDl/v1E6jojgSdeXox/Vh49s0ByKIrCgr59uWhrSwFV5S2gqKryHTCvZ09yxBkDtSr6WHOA+zlyMEVRuKtprNq/H+25sbMiPln8QAiRlUkyK0QW9zAkhL0XL+Lh6Miq4cM588UXzOrSBRtVZV0Kl3CtWqQIJ7/4gn6tWhFVoQIN69fnwPTp9I0eI/u8dYcOATCkZUtOf/EFuyZNwsfDg9tBQRy7di1FcWRmksgKIbI6mc1AiAzIpGlEGo042tmluK2IqCg+W7eOrvXq4ZMjR0z54cuX8bt4kQHNmqX4GImx5J9/yOnqSpPy5WPKHoWG8s1ff9GvceN4PblZVayhsDIuVgiRSSVlNgNJZoXIgCYtX86S3bs5N2+eRVbpEpYhN3YJIbIKmZpLiDTyMCSE9YcPs/3UKYutTqXrOr/t3MnFe/c4dPnyS+tqmsa+8+dZe+gQtx4+TKcIRVqQRFYABAbe4dChtZw7t0fGkgsRTWYzECIRdF1nysqVTF+5kgiTCYC8bm4sHjiQhmXLpmssJ2/c4NKDByiYb9CqXrToC+u9PXs25/z9ATAoCu83bMjXvXphEz1tlsgYJJEVmmbil18Gs2XLAnTd/DsoV66iDBv2BwULVrRwdEJYliSzQiTCol27mPC///Ex0A94CIwMDqbVzJmcmzcP7+fGmqa20PBwun71FcFPngBw+9Ej3FSVNprGD1u3cjR6KVhFVfm4TRsali1LWGQkzaZMIWdICLuAIsAfus7IbdvI6erKlHffTbN4ReqSRFYArF49g7/+WgDMADoBVwkIGMyUKc2YP/8yDg7ZLByhEJYjyawQifDlhg20wvwxAuALrNJ18ptM/LxjBxM6pF2yYVBVbgcEcPDqVZyAN4ARQA0gKiyMo2fOcBZwtbePWYhgpZ8fd4KCYhJZgCHATV1n/p9/MqFDB+mdtSDJTUVSaJrGxo1fYf5TekR0aT40bSWhoYXYt+8PGjToZcEIhbAsGTMrRCJcvneP1+KUuQLlorelJUc7O/6ZNo2RrVrxFAhRFLoCpYAGwEVFoUbhwhyfM4c6JUvGxOtlMMQkss/UBgKfPuVxdC+vSH9JTmQl883yIiKeEBp6H+L9FvLFYMiPv//Lx84LkdlJMitEIhTPm5cdcVbCegQc03WK5cmT5se3s7Hh0y5dGNi8Of8oCv7AYWAvkD1bNnZPmULBXLlixetvMnE2TjvbgZzOzrg7O6d5zCI+yUtFctjbO+PmlhfYEWfLJUymm+TNW9wSYQlhNWSYgRCJMLRVKzrOm8cAzF/0BQCfKAoGOzt6NWiQbnH8c/o02TWNiqpKgKZRCbgfEsJFf39K5c8fU69NtWr4Zs9Om8ePma1pFAOWAQuASW+8IUMMUokkpyI9qKrKm28O5rffRgFeQGfgCqo6AheXvNSsKW9EkbVJz6wQifDua6/xedeuLLa3pyzwOuYlV/8cO5Y8Hh7pEsOVe/c4duMGN4Dq5coxo1MnTkbPMbvSzy9WXXtbW7aMH082b2/eBIoD0w0GhrzxBqPbtEmXeDO7dEtkOyxPpwMJa/bGG8No3XoUNjafASWAFuTLZ8uECVuxt5c500XWJosmCJEEoeHhHL58GWd7eyoXKpSuCxasO3yYDp9/zmdduvBR8+YoisLRK1d49/PPqVCoEP8bOjTePrquc/LGDQJCQijn4yOraKUSi/TISjewAEJDA7l27TjZsnni61sOJc7wJyEyC1kB7CUkmRUZla7rhIaH4+LoGKs8ymjEqGmpsrTto9BQfty+naFvvIHhFYl6eGQkczdtYmDz5jjZ26f42BmJxfJKSWiFEFmErAAmRCakKEq8RBbA1sYmVRJZgB+3b2fkb7+x68yZV9ZdffAgo5cuZfn+/alybCGEECI5LJrMLliwgHLlyuHq6oqrqys1a9Zk8+bNL6y/c+dOFEWJ9zh37lw6Ri1ExqBpGuP/+IN8ffqQvWtXqnz8MfsvXHhh/d1nzvDZ6tUADPzlF87euvXS9p+N0407Xje9BAQHM3nFCuqPH0+LadP4dfduTOmwvKd0jgohhHWx6GwG+fPnZ+bMmRQpYp4Nc9GiRbz11lscO3aM0qVLv3C/8+fPx+pyzpkzZ5rHKkRGU3v8ePZfuEBFzLeLbLpyhbpjx/L7kCG0r1kTgHuPH3P38WP+2LuXmWvXAlAQuHjzJhVGjODrXr2oWqQIhXLlwqhp3AgIAMBoMrH52DEKAltOnODgpUsxCzZ4e3ri6eKSps/tTmAgr33yCfcDA2mh6wQoCl1PnGDD4cP8PnhwmoxlliRWCCGsk0WT2TfffDPWz9OmTWPBggX4+fm9NJnNlSsX7u7uaRydEBnX5mPH2H/hAtOB0dFljzGvGtb/++9jktk648dz0d8/Zj9H4FugKYDJRJ/vvwfgnVq1uB8UxI7Tp2PqqsCPQBOTiepjxsSU1ypWjL1Tp6bVUwNg8ooVPHn0iDO6ji+ArvM/4B0/P7odP06LSpXS9PhCCCGsh9WMmTWZTCxbtownT55QM/qD9kUqVqxInjx5aNiwITt2xJ1EOraIiAiCg4NjPYTI7L7cvBlH4Pn5DdyBYUDAkyfcCQwE4NePPiJ3NvOa7sOBc0AT4BTQOnq/Sr6+zOrShfnvv095b28AugPnMa9Adh54P7pu6bx5+a5Pn7R6WjFW+/nRU9PMiWy0DkAJg4E1hw6l+fGFEEJYD4snsydPniRbtmzY29vTr18/Vq9eTalSpRKsmydPHr7//ntWrlzJqlWrKF68OA0bNmT37t0vbH/GjBm4ubnFPLyjP4yFyMx0XUch/gX+bKkELXoSk+pFizK5Y0cUYDZwO3r7LmBN9L9/GTAAnxw5KJEvH34zZvBBkyYsBI5Fbz+NuYe2T8OGHJo1izI+PmnynJ6n6zpxl31QAIOuxzw3IYQQWYPFk9nixYtz/Phx/Pz86N+/P926dePMC+6kLl68OL1796ZSpUrUrFmT+fPn07JlS2bPnv3C9kePHk1QUFDM4+bNm2n1VISwGn0bNeIp8M1zZaHAXMDD0ZH8np4x5a2rVUNRFAzAWaAlEB69Lb+7O2We+wPQwc6O5hUrAvAQaA48G6TQtEKFVJtV4VXerFaNX1SVu8+VrQdOaxqtqlRJlxgsQhZQEEKIeCyezNrZ2VGkSBGqVKnCjBkzKF++PPPmzUv0/jVq1ODixYsv3G5vbx8zW8KzhxCZXZvq1Snv68sQoB7QBygEnAHm9uwZq24uNzcK58qFDvTCvPr7iOhtNUqUiHcz1bPZCz4EDjk70y9OeXqY0KEDiosLpVSV7sCbmIdFvFGxIi0z+3hZSWiFECIWiyezcem6TkRERKLrHzt2jDx58qRhREJkTEc//ZSPmjXjjLMzy2xsyJEvHxvHjKFrvXqx6j1+8oQrDx5go6qU9famaL58FM+XD4B/r16NVVfTNNYdOoSqKEx4+23u/PAD0zp2xKAorD98mCijMV2em0+OHByeNYveb7zBKV9fgosX55v332fViBGvXOwhOWQmAyGEsF4Wnc1gzJgxNG/eHG9vb0JCQli2bBk7d+7kzz//BMxDBG7fvs3ixYsBmDt3LgUKFKB06dJERkby22+/sXLlSlauXGnJpyGEVVJVlS979uTLOD2xcdnZ2NC3USP6NWlC2efGu24+dox958/HqqsoCl3r16ddjRrULlECgNFt2lC/dGl+37MnTRLJF8nj4cGsLl2gS5c0PY4kskIIYd0smszeu3eP9957j7t37+Lm5ka5cuX4888/ady4MQB3797lxo0bMfUjIyMZPnw4t2/fxtHRkdKlS7Nx40ZatGhhqacghNVbvn8/I3/7jXNz52Jvaxtvu5O9Pd+8/3688uYVK8aMj31GURS+6N49Xt2axYpRs1ixVItZWA+jMYohQ0rRocME6tZN2z8chBAiOSyazP70008v3b5w4cJYP48cOZKRI0emYURCvFxEVBQnb9zAyd6ekvnyoShKqrRrNBpZc+gQ4VFRtK1WDScHh1RpF+CbzZu59uABaw8f5u1XTHt36+FDbgcGUjRPHrJHT9n1IvceP+bagwf45syJVyrO++z/+DGbjx3DJ0cOGpYtm2rtZkQPbz0k8HYgeYrmIVv2l5+PpAgNfcTduxfw8MhDjhwvn33i9Okd3Lt3iW3bfpZkVghhlSyazAqRkXz/9998smQJAU+eAFAuf35+GTCASoUKpajdeZs2MXrxYsKil2LtpSj0a9aMeT16pKjda/fv03nuXPZfugRA57lzOXPzJuPbt493U1dAcDC95s9n3dGjANgbDPRu1Ig53brFrOz1zJPwcD744QeW7NmDSdcxKArv1KzJt3374uLomOx4NU2j6bRp7Dh5ElN0mbu9PStHjqSBhZJaSw0xCA4IZn6v+RxdZz4fBnsDjXo3otucbtjYJf/Xtslk5NdfR7Bly7cYjeY5K8qXb8GAAb/g5pYrwX0OHDAP4zp3bhfBwQ9wdZUVF4UQ1kXR9aw1KWNwcDBubm4ELVyIq5OTpcMRGcTqgwdpO3s23YD+QAAwXlW55uDA2XnzyOXmlqx2t588SZMpU6gJjMe8AtfnwGrgy+7d+SiJQ2h0XWfkb79xOzCQDYcPExURQTjQDVgGRAAVCxSgVP78vFe3Lk0rVEDXdeqOG8f5S5eYqWlUAjYBExWFD5o1Y26cpLrT3Lms8/NjmqZRH/gHGKOqNK5cmZUjRpBc7efMYeWBAwwFOgFXgFHAHVXF/8cfcX9FT3Fqs1Qiq+s64+qO49L5S2gzNZ6dEGWiQrMPmtFjbo9kB/fbbyNZv/4LdH085jkgTqCqo/D19WXmTD8UReHkyW3s2PFLzD5HjmwkLKwV8BulS9fFw8N8c6CbWy7ee292miwdLIQQT58G0727G0FBQa+ciUp6ZoVIhM9Wr6aBovBL9GIEANU0DZ+wMH7esYOPW7dOVrsjlyzBFfgTcI4uqwWUA2asXp3kZFbTdf45c4YDly9jA9QEqgEfAHeAG8Cxa9c4fu0aDcqUAeDAxYvsuXCBDZjnmAWoAJh0nelbtzLpnXdwi/7D70ZAAMv27WMB0De6bnnAWdPoeegQl/39KezlleTXQdM0Nhw8SFdgTnRZZaAMUErTGLNsGfMTGNebGV08cJELey4Q94ToJp2t07fyzqR3cOqwPMkJbXh4KJs3z0fXRwHjYhrWtHxcvdqYs2d3U6pUPR49usvevb+j6xqKUhyoAowB8nL27D407X9AFL6+ldA0kySzQgiLk99CQiTC6Vu3aPpcIguQE6isKJy5dSvZ7V6/f596/JfIgvmibA4EhYQkuT2DqrJr8mRqFiuGEXABpmKeY3Yc8ADzKmArhw2jZ4MGADHxN43TVlMg3Gjkyr17MWXnbt9Gx7zkbdy6z7eVVP6PHxOh6/FiKAnkAY5fu5asdjOiW2eiX8METogx3Mi9K9HnI4nzzQYE3CQq6kkCDTcEVG7dMi9WU7duFyZM2I67e34U5QG6PhooDkxC1z2AKJo1+4hp0/ZiYxP/hkIhhEhvkswKkQi+OXJwKE7ZE+BU9LbkyuHmxkEg7uys+wHHZN4EZm9rS59GjQDzcIE7wCVgM/AY8+wFb1SuHFPfN6d5DOTBOO0cBAyKQr7s2ePVjftaHIyzPalyuLpik0C7t4F7QKHcuZPVbkaU0zf6NUzghCgGhez5ssfbJzHc3b1QVVviv8pHAY0cOXxjSkqVqsfs2cdQ1afARuAycA9dX0vbtmPp2fNL7OxS7yZFIYRICUlmhUiED1u0YAUwDfMyrueBjkC4otAruoczOca3a8ddzGNar2JO3EYCe4Fe0VPUJUeHGjWwNxjIAbQFimHOjTSgZZUq2D53U9frpUtTwsuLHqrKbsxJ+nJgnKryds2ascYDF8+bl4alSjFYVdkUXfcv4CNVpXaxYpTz/S8hSgo7GxtqFC/OV8ACIAg4DnTA/EtqeseOyWo3Iyr9emm8Snih9lB5/oSo41Rqvl0Tt1zJG5+dLZsHtWt3QlUnAr9jXuB4L6ralZw5C1O+fOz+dn//S9E3iZ0AiqKqLVAUL65fP5mCZyeEEKlPklkhEqFPo0aMaNWKCYpCDqAEsM/JiRXDh1MgV8J3gSdGx9q16dekCX9gHgrghXnMaNPy5fm0c+dkt6uqKgZFIQBz77EObI/elt3ZOV7d9WPGYOvlRT0gG/A2UKNMGRb06ROv7SWDB1OwUCFaRtdtBuQrUIA/hg5NdrwAf33yCYVy5+YDwB2oCBxRFBb07YtPCnq/MxpVVRmzfgxetl48f0LK1ChDnwXxz0dS9Or1FeXL18N8i50LUJtcuTTGjNmAwRD7Fgo/vxUAKMpOWrcehZeXjq77c+LEX4SHh6YoDiGESE0ym4EQSXA7MJDdZ87g7OBA43LlcLSzS5V27wQGMnfTJiKioujXpAklo5eTTa5Dly5RbcwYetavz1tVqxISHo6DrS2jfv0Vj2zZOPTpp/H20TSNPefOcSMggHK+vi/tZdV1ncOXL3P+zh2KeHlRvWjRVJtzd/vJk6w4cIC8Hh4MbdkyVefcTQpLr/ylaRrn9pwj4EYAvuV88S2XwPlIZpA3bpzi+vUTZM+ej5Il6yZ4E9fYsbV5+PA2Q4b8TrFiNYiMDGPRomFs3bqAyZP/oUSJ2sk6thBCJEZSZjOQZFaITEjXda7evx9vrOnTiAiCnj4lj4dHgvs9jYhg5YEDdKlTJ9WS04zK0slsoqRhkI8f++Pg4IKDgzMHD66mWLFauLvn5t69K+TKVdCq3x/371/jzp1zVKjQzNKhCCGSKSnJrAwzECITUhQlwZumnOztX5jIAvy0fTtdv/6a/RcupGV4IgNwd/fCwcGZwMA7zJ7dljVrZgCQO3chq05kAZYuHcNnn7UlPPyJpUMRQqQDSWaFyMQOX77Mhz/+yNuff86c9et5FPrysY4r9+83///AgfQIT1i5p0+D+OWXgQD8vesHLlzws3BEL6frOseP/4Wf3yqiosJYtGiIJLRCZAEyzECITGruxo0MWbQIH4OBwprGXiCXmxu7pkyJ6bUNi4wk6OlTAB6FhlJm2DBy6jr2Hh74zZwZ0wPnmS1brBkQsoIMMcwAUj1QTdMIDr7Pw4e3+PTTNjwOvgU5gPvm7W3bjqVZsw+xt3fG0dElVY+dXE+fBhEZGcby5ZPZunVBdGku4D65cxdj5MhVuLjkwM0tl9X3KgshzGTM7EtIMiuygusPHlBowAAG6TqfYV4o4SZQV1UpV7Eia0eNAqDk4MGcu3MnZj8bYCnm2Qye17l2bX4bODB9grcSGSaZhVQN9n//m8CKFZNjF34LfGKAh6aYInsHZ375ORAbm9S5CTK5goMD6Ns3DybT87M1lwS6AJ/Eqtuz51c0azYgPcMTQiSTjJkVIotb4eeHPTAFcyIL4A0M0zQ2HD3Kk/BwAD7v1o0c0VN1DQEOAO0xT+PVOnq/El5eyV6uV2Q8DRv2pkjx6uYfamJeeaMnsNdknmjZFlRbAz26f2nxRBbA1TUHnTrNxPxOdwK+wLzQwxBgDebFoaF8+ea89lrWma9YiKxEklkhMqHwqCjsFYW4k1q5A5quE2k092I1r1iRE3Pm8HrJkszFPB+tgnkBhzXA+w0acHjWLMr4+KRb7NYgQ/XKpjJPz/yMHb3F/MN+4B/AFvAAJimgG2hYvzcNGvS0XJBxvPnmMKpWbYX5HTwR84zNjsAG4Ayqasfo0RtwcfG0YJRCiLQiyawQmVCTcuV4rGksfa4sCvhWUahasCAe2bLFlOfNnp2ur78OwHXgfSA8etvAFi1wttA8r+lteYf/Hlmdk5MrhQpVN/9lYw98iHk1MnsFjCbq1En+gh5ppW7dLkAYkB1YAQzFvOKEQsWKzROcS1cIkTkk+44OTdMS/OWgaRq3bt3CJ4v15AhhTaoWKULHWrXosW8fm4CiwCpV5QLw53vvxau/cv9+DJjHyhoMBpZqGug6K/38KJsFrmVJYOOrUKERV64cgJlAhArzNXDQsM+WjeLFX7N0ePFUqtQSVXVA0/yBrpg/3myAKCpVkvlmhcjMkvynanBwMG+//TbOzs7kzp2bCRMmYDL9d1PAgwcPKFiwYKoGKYRIusUffcTsbt04nS8fP7i4UKRiRf6ZMoUGZcrEqhcSFsaWf/9FUxQ+ad+euz/8wFs1agCwct8+S4SeriSRTdj1m/8CkM0+B85Onri55UE1GogIDeXOnfMWji6+ixcPoGnhGAzg6uqFs7MHzs7mbyCuXDlq4eiEEGkpyT2z48aN48SJE/z66688fvyYqVOncuTIEVatWoVd9NKeWWyCBCGsko3BwOCWLRncsuUr675RuTIDW7SgXqlSACwdPJhmFSuy97z1JS2pSRLZFyvgW4ESxWrz5pvDUFXzbYQ3bpzif/+bgK2t9Q09cXZ2p0aNDnTuPJPcuQsBYDRGsnLlVJyd3S0bnBAiTSV5ai5fX18WLVpE/fr1AXj48CEtW7bEzc2NdevW8fjxY/LmzRurt9aayNRcIqXaz55N4/Ll6du48Svrlh86FA8XF3ZOmpQOkYlXydTJa6Z+cmnn+PE/Wb58EpMn/4PBkHpzKQcE3GD6jBaMGrkuJrlODZpmYsKE+rz11giqVGmVau0KYW3SdGqugIAAfH19Y3729PRk69athISE0KJFC55GT8AuhCVFGY1cf/CA0PDwV1dOgiv37rHy4EHmb978yrp3AgM5desW+86eJTwyMlXjSIrgp0+5ERCA0Ur/wEwv1pLrPQ1+SsCNAEzGVD4fHZanbnvJoGkaly4d4u7di6+sq+s6jx7dJSjofjpE9mJbtnzHxYt+nDmz65V1w8Of8ODBdYzGV1/Pe/cu49bN0+zZs/SVdZPi/Pl9nD+/hy1bvkvVdoXIyJKczHp7e3P27NlYZS4uLmzZsoWwsDDatGmTasEJkVS6rjNr7Vry9e5NgQ8/JEePHry/YAEhYWGp0v6q6GVe/711i4t377607qdr16JhnkVg/l9/pcrxkyIgOJiOX3yBZ8+e+H7wAQX69eO7rVvTPQ5rYA2JbHBAMF90/IKenj35wPcD+hXox9bvUvl8WDChXbJkNJ27OTBmTDUGDSpGz/dzcPLk9gTrnjmzmxEjKtO3b156987NJ5/Utsi41vDwUI4f/xMAP78VL6n3hO+/70fPnjn48MMCvP9+XlatmoamaS/cZ9/BPwDYe3BZqsZ84MBKAP79dytPnjxO1baFyKiSPMxg4MCB3L17l+XL4//SDAkJoXHjxhw6dEiGGQiLmL5qFZ8sW0Z/4E3gBDBdValRqhR/jRuX5KUsz9+5w0/bt8eMA1994ACF7t9nr6JQp1y5mDv9XRwdaVKuHEMWLcIY/QF3+sYNikVFcR8IdXCgeL58ANjb2LDoww8p7OWVSs86PpOmUX3UKG7cvMkYTaMo8AfwK/BD376837Bhmh3bWlhDAvuMZtIYVX0UN2/cRBuj8fwJ6ftDXxq+n4rnwwJPfM2aWSxdOgqaAX2BAGAqKHdUvp57hZw5//s27/r1fxk9ujomUyV0fRAQiarOxs7uGnPmnIhVNy1s2PA5jx6Z/xB9+PAm+/b9AbTGyekfGjbsEVOvevV2FCtmvhFyxow3OXFiB5o2GqgEbAa+pn37cbz9tnkIkZ/fSi5e9APAZDKyadNcaAOshubNB8YsMFG4cBVq1Xon0fFeunSI/fv/F/Pzjh2LCQ2tBayhRo325MxZAABX15y0ajVClusVmUZShhkkeYDQpEmTuPPc8pfPc3Fx4e+//+bIkSNJbVaIFAuPjGT22rUMBOZFlzUHimsabU+d4tDly1QrUiRJbZ67fZvZ69ahA7lUFU9FYThQVddZeeoUu0+cIAzIkS0bbo6OHLh4ER1wA/ICw4FHwNzwcM5dvkwo5q9DLty9m6bJ7J/Hj3Pk+nX+AWpHl7XE3Es8bflyer7+eqaed9OaElmA438e5/qR6yR0QpZPW87rPTP2+VizfgZUwbzw1rOn0QT0QhqLFg1h+PBVMXXXr/8cTfNC17dB9LIemvYmkZGF+PPPr3nvvc/SLE6TycjWrd9z9+55wAaDoTCK0gVd/5jw8I5s3Pg7mnYbgOzZ81GsWA2uXTvBsWMbMC/0/GwFseaAA+vXf0GrViNxcHDm0OE1/LP7NwAMBW1RaxjQFphQ7xvYcn4BpitRANSo2SFJyezly4dYv342AKqaF8gFTEBRsnPo0F5MprVAFLlyFaZly8FWsSqbEOktyb89XVxcKFq0KJGRkQk+7OzsqFmzZszPRqPx1Y0KkQqu3r/Po7Aw2sYpb4X5jX7kypUkt/lW1apsGz+evG5umIB5JhNNgKnA2yYT4cDrJUtyYvZsBrVsyZKBA3E0GIjAvJRsF+AjYBjmhQiy2dqyacwYmlesmPwnmghHrlwhl8EQkzc90w64FhhIYGhomh7fEqx50YMrR65gyGUgoRMSeC2Q0MCMfT6ehj02v7me/0TxASrBtWsnYtW9ePEwmtYSYq1P54amNeTSpbTtCDEYbJgx4wC1anUEjJhMtdD1X4DSaNqvgB329q4MGvQ7LVsOBuDKlWcxtYvTWlsiIkLw9zePD/7wg4W8884UFIOK7qWhrTFBbtDWmNDymVBUhfbtxzNoYNLG0DZt+gFDhy7HwcEdsEHTFgIV0PXvMZnqAVFUr96BTz89LImsyLKS3DNbrVo13N3dXzr91rOvOXRd58mTJxw8eDD5EQqRSDlcXVEVhbO6Tr3nyi8AGuDl7p6sdl8vU4YTc+ZQbtgwvg0KohpgB8xSFDrUqMHSQYMwRPeqdaxdm9fLlKHghx8yJyqKVphXjJ8BODs5cWP+/HQZ3uLl7s5Dkwl/zAt7PnMGcLK1xcXRMc1jSE/WmMA+z93LHdNDEwmdEFsnWxxdos9HUp6IFdzw9YzBYIvpTFTswgjgErhkj72ErIeHF/7+Z4j9EaKjqmfx8Cib1qHi5OTGoEFLyJXLlzVrZgLjMX+X8htwk9mzz8eafcDd/dkJOwNUeK6lM4CCq2suAFTVQLt2Y/HxKctnn7WGHUBjYDfo/2gMGfI/atZM3hu1Ro32FC5clUGDSqBpi4FCwFPge1q2HELXrnNkeIHI0pKczOq6zvbtCQ/qT0jVqlWTegghkiWnqyutq1RhwpEjFNc06gOXgZ6KQh4XF1qkoDfUpGn4BwURBvioKgWBQprGrQcPYhLZZ5zs7DBGReECFMTc/5QXOBEWRrZ0Whr27Zo1Gb5oEd0jI/lB18mH+Rvg2apK1/r1sbe1TZc40oq1J69x1Xy7JouGLyKyeyT6DzrPTog6W6V+1/rY2tsm/Ukt7xA/obXQC1O+dBOOLtkI9TAvvhWM+euIR9C+z/hYdRs3fp8zZzoCnwIDASMwDU07RaNG80gPiqLw8OFtFCUn5gWc/0HX30DTjISEBMRKZsuVa4yHhzdBQb3RtCWYBzzvQVXHUq5cC7Jnzxur7UePoofhrcE8KuGdOOXJ9OTJI4zGcOAGipIHqAHkITDwjiSyIstL8jCDpF40cpGJ9PRt3774+vrSAHBVVYoCV5ydWfPxxylK4NYcOoSO+baPxlWqEJErF2eBfZcucScwMFbdzzdswAjsBDRnZ4Ls7DgIROg6v/3zT7JjSAp3Z2dWjRiBn709voCrotAKqFqiBLO6dEmXGNJKRktkAZzdnRmxagT2fvbgC4qrAq2gRNUSdJmVwvNhBeMrhg5dQc6cBc15oQvmYZ2LoUGD96lc+Y1YdWvVeodWrUYAH6MoHiiKJ4ryGZ06zaRMmQbpEq/RGMmhQ+vQ9Qe4uJyhXr3OgHlcb9xZDWxsbBk1ag3Zst0GiqOqrkBd8uf34oMPfozX9v4D5pu1DKttadKkPzZr7AHYd+CPFMX8X1xrqFv3XVxdL6HrdzlyZCORkak7BaEQGU3qzRAthBXI6eqK34wZbDt1ihPXrpEve3ZaV6uGo13KxpLtOH0aJ1tbvn7/fbrXr8/TiAgGL1zIj9u3s+vMGTrW/m8w5IajR1GA5hUrsnbECCKNRhpNncr+Cxf4Y98+utar9+IDpaJG5cpx87vvWHXgAAEhIVQrUoTaJUpkyD8wM2ICG1e5RuX47uZ3HFh1gJCAEIpUK0KJ2ik8H1bywtjZOfDNV1fYt+9/7NmzFEfHbLRt+wn58pWMV1dRFLp0mUWjRn04enQjqmqgSpW3yJHDO93ivXbtOOHhQVSo0JIBA37B1TUnNWq056uvunPy5I549QsVqsT8+Vc4fHgtAQE38fEpS7lyjePdtKdpGmfP7CGvT3GGDlyOj09ZmjX7iM+/bM/Fc35ERUVga2ufrJhPndqJk5MnAwb8QpUqbxIS8pAFC97n8OE1XLlymBIl4g7IFiLrSPLUXJUqVeLo0cTPB1itWjWrGjMrU3OJ5Lh6/z4GVcUnR45Y5QcvXaKMtzdO9v99QP17/Tq3AwPj3eS1Yv9+KhcqRMHcuVMcz/2gIG4EBFClcOEUt2XtrCRfS3tZ5ommvaCg+wQE3KBw4SoJbtc0Excu+FG8eK1Yf0wEBz8gOPgB+fOXSnA/ozGKM2d2Ua5coxce+9KlQ3h7l8be/r/Pl8jIcK5fP0HRotWT+Yzg9u1zODt74O7+3+8PXde5cGE/RYpUS9XVy4SwBmk6NZcQWVHBXLkSLE9oqq9yvr6U840/V2b7mjVTLZ7RS5eyfN8+7v/0Ew4p7HW2RpLXiZRYunQ0+/z+4KcfArCziz9OXVUNlCjxWrxyV9ecuLrmfGG7u3Yt4rvvejNz5hEKFaqUYJ0iReLfJ2Jn55CiRBYgX74S8coURaF48VopaleIzCDJyaynpye1aiX+4skRpydLiIzKpGlsOnqU7adO4WRvz7uvvRazaEJKHbp0iRV+fkSZTLSoWJGGZcu+8OvnE9ev88c///DEaGTKypVMevttbAyGVInDGkgimzFpmomjRzdx6tR27O2deO21d/HxSfvZCeI6cGAVu/YuQos08dVX7/HRR78mmNAm1fXr/7JkyRgAvvmmG+PGbX1upgMhhCUleZjB6NGjuXbtWqLrFylShClTpiQ1rjQjwwxEcjyNiOCN6dPZcfYshQ0GgnSdAE1j2rvvMqZt3JltE0/XdYYuWsTcTZvwMhiwA26YTLSpWpU/hgzB1ib235uz161jxG/midldMd80XrtYMTaPHZtuMyWkNkleo2XgFyIi4inTp7/B2bM7MBgKo+tBaFoA7747jbZtx6RbHDNnvsHRoxvNP0RfIA7OLnz5xYUUJZ5r1sxk6e+jQVeiG34CNiY+GfUX5cs3To3QhRBxJGWYQbLGzK5Zs+al88w+r0OHDjJmVmR445YtY87q1azVdRpjXklrEjANODh9OlWTuLLYM5uOHqXlzJl8jnmSIhVYCbwLfNGjBx81b05AcDCFP/qI4LCwmP0KAJ2jj/+Moij80LcvvRqkzx3hqSED52+pLwO/GMuWjWP16jno+lqIc4VMn34wwa/eU0twcAAfDSxE2NOQ/woLEO8CURSFvn1/oEGDXolu++OPq3LlyuHnShTge6B3rHoNG/amb9/vkx68EOKFkpLMJnlqLl3X8fHxwdfXN1GPJObKQlilX3fsoFt0Igtgi/mjOr/BkKLptn7dvZsKqspgzIsrKEB74K3oYwJ4urjQu2FDAJwwfz6vwrxU7o9Auei2qhQoQJNy5bB2VjCTlEhlO3b8iq53gzhXiMGQn3/++S1Nj+3i4knDBn3MP7zkAilQuCLlyjVJUtstWgxEVZ9N6TcA8+R8PTEvbfuW+ZBOOahXr1vKnoQQIkVknlkhEiEoLIx8ccoMQB5dJ+jp0+S3+/Qp+TSNuFdJ/uhtYL6GZnftSrMKFTAB84FSgDtwCvgXsFEU9kybhreVj1GXBDaOTJLZh4UFQQJXiK7n4enToDQ9tqIodO06m+zZ85vXX0joAgGmTd6f5Om/6tZ9jypV3gAMoHyH+Tmq0Y+1gMJ7781I8GYyIUT6SXIyK0RWVLd0aX5XVZ6fmvwkcFjTqFMy/lyaiW63VCm2KQo3nisLBlaqKnVKl45Vt3Pt2kRgXpp3J/BZdLk90KB0aexsrHtykgyer6W+TPSClC5dF1X9HeJcIZp2mJIl66RLDJUrvwGRxL9A7MDZJTs2Nsmb9aNx4/6ACfQo4BYwFoge0mDQqVnz7ZQFLoRIMev+9BPCSoxr3546J05QE+iuaTwE5qsqpby86FQ7+ZOV92nUiG///JOajx/TX9NwBH5QVULt7Bj51lux6rarXp0+8+fzVNNoFl3mDkQArapVS3YM6SET5W0pk0lfiPbtx3HiRB2gJprWHXiIqs7Hy6sUtWt3SpcYOnacwdad38JTiHWBRMLrTbonu93y5Rtjb+9CREQEKG1ADwfcAPDOWwYnp5eP5RNCpL0kJ7O6rjN58uRE1xUiM6hSuDA7Jk5k3O+/M/TMGZxsbelUty5T3303RauLZc+WjX+mTmXM0qVM9/MjStNoUbEiyzt2pFje2Gu+/3vjBmGaRqSiYK+qRJpMGG1tISqKc3dStu57Wsqk+VvSWNOL0GF5qsdTuHAVJk7cwe+/j+PMmaHY2jpRt24n3n13KnZ2jql6rBe5e/e8+b6zEMyDz3VQnijo6BiNkcluNyLiKZpmwtztGz0gSHkCOqhq8lbzEkKkriQns/Pnzyc4ODjR9Zs2bZrUQwhhlWoUK8bWCRPQNA1FUVJtPLh3jhz8OnAgiz/6CHjxOHNd16ldvDjzevSgYsGC6LrOk4gIhi5ahJtj+iQMSWVNOZzFWOOLkAYJbbFiNZgwYWuqXx+Jpes6xUu8Ro/uX1KgQAU0TSMqKoxFi4bgmILe06ioCAoUKE/LloOpVettjEYjqqqwbt1nnD+/PxWfgRAiuZI8NVdGJ1NzCWvVad48bjx4wJ6pU1O13T3nzvH5+vWsGDYs3lryackac7h0Z40vQofl//3bGuN7gS1bvuVh4E06vjvtlXV/+20khw+vY+7cc+kQmRAiLaTp1FxCWIqu60QajYkevpKUupamaRqr9u1j/4UL+D9+nKj6UUZjotr+5s8/WX3oEPsuXEhhlImX0hzJGJU25y4yPBJjZOJeN82kYTKaUj0GTdMIDw9NVF1dT/xX5M/a1TQt4QodlsdOZJ+VWVBYWCiRkWGvrKfrOqvWTWX9htmJeu3+2raAO3fOc/bsnkS1nZJhCKnFaIxM9HveaIzKML/bwPzeNBqjElXXWs6HyFgsmswuWLCAcuXK4erqiqurKzVr1mTz5s0v3WfXrl1UrlwZBwcHChUqxLfffptO0QpL0XWduRs3UrB/f+w7dcKnb19mr1v3wg/txbt2UWrgQOw7dSJ3z56MXbaMyEQmfpaydM8eInQdDfh0zZoX1nsQHEyvBQvI9t572HXqRJ2xY9l5+vQL64dHRrLhsHnS95V+fqkcdeo7suEII6qMoJNdJ7q6d+XngT8TFvLqZOdVDqw8QK/cveji2IVODp3om78vJ7efTLDu/Wv3+fydz+nk2ImOdh2Z0mwKV49dTXEMjx/7M3JkJd7tbKBrVxc6d3NkyZLRCdY1GqP43/8m8v77eejUyZ4BA4qzffvPCSYwmqbx2Wdt6NjVjq5dXej4ni0zZ76B0Wj8L4F9WdKa3G0psGHD53Ts6Ei3bi506eJM585O7Nr14vlor149SuD92xgjIzl6dNNL47t27TgRT8wJ7/r1n8Xb/kx4eCgLFw6hWzcPOnWyZ/jwShw8uCbZzym5du1azMCBpejUyZ6ePXOzbNnYFyZzR45sYMSIKnTqZEfXru78/PNAwsJCEqxrDYKDH7BgQS/eey8bnTrZMXZsHU6f3plgXWs5HyJjsugwg/Xr12MwGCgSvXrSokWL+Oyzzzh27Bil40xLBHD16lXKlClD79696du3L3v37uWDDz7g999/p127dok6pgwzyHg++f13pq9eTTegPvAP8Asw9I03mN21a6y6327ZQv8ff6QN8CZwAligKLSpXp1lQ4emc+QvFhAczAc//khYlLm34uDFi0QEB5MfuOHgQL3o97+NqjKzUyeK58tHeGQk1UaN4s7duwzUNHIBCxWFI4rCjokTqV2iBGBOjO8+egTA1fv3+eavv3gdOOfqyrDnZkhoXrEipfLnT5Pnl5ye2cPrDjOr9SyU1xX0jjpcAfVrlSLlizB51+RkD5E4ue0kU5pNgYLAh5hvEvoS8IfZR2fjU8Ynpm5wQDDDKw4nWAlGG6CBI6jfqdjesGXmwZnkKxF3LtVXiH4hNE2jZ29PnkY9hkFAUeB3YBu88cZQunadE2u3r77qxp49v6PrfYFKwCZgBd27z6VFi0Gx6o4d+xoXLuyDrsDrwG5gIRSsVJBPD3+apDjTw65di/nmm55AIWKfkLtMmLCV0qXrExHxlB07fiEqyjzV1+nTOzl+dTPkh8IRValRvT2UP4FqUKn5dk2WvLuXp0/N7/mbN09z/+FVqA6Gw3ZUKGteKEFRVFq1GkmJEq+h6zqTJjXi3LkDaNoAoCiK8ge6vpWhQ5dTo0b7dHkttmz5lh9/7A/P/cZSlAVUr96GoUOXxap7+PA6Zs1qjaK8jq53BK6gql9TpEh5Jk/ela5DiBIjMjKcUaOqcffuHTRtIJALRVmIohxh4sQdlCjx3yww1nI+hHVJ0+Vs01r27Nn57LPP6NUr/pKDo0aNYt26dZw9ezamrF+/fpw4cYL9+xM3EF+S2YwlMDSUfH36MNxoZMpz5VOByarKre++I5ebeZqcKKMR7759aR4Swi/P1V0EdAf+nT2bsj4+WIPNx47RYsYMwHwXpj3m5WwLAkMx3zf9rG9meseOjG7ThsW7dtHtm284DpSP3hYF1FBVPEuVYsv48RhNJnz79+fO48eoQDZVpSowQ9Nooao81XWeRl/yk99+m3Ht0+ZDIjm50dAKQ7md8zb6X/p/3xltAxrBmM1jqNCsQrJiGVp6KLce3IJLwLPfh/eAglCyakkm7ZoUU3fV9FX8MfUP9Iv6f2sAhIJaUqVu47p88PMHSTt49Auxfv3n/PrrMNgItIjepgNvgGGbLUsWhcckI3funGfw4BLAt0Df5xrrh5PTCr7//hZ2dg4A+PtfZuDgIjAG4l0g42HOyTl4l07EQgHpmMz26JGdJ09sSOiE5MiRk/nzr3PnznmGDS+LyRgFtgqqg4o2wAQFQR1uQI/Q0CPM7+P+P/dnQa8F5tdTBRwx54ZvA10wz10XYT7K66/3oH//nzl1ageTJzcg/gl5Ey+vK8ybdzrNb2AzGqPo29ebkJDmkMBvrNmz/8XHp2xM6dChFbh9Oye6/hdxL5AxYzZToUIzrIn5j5ZuEOc3lqrWoFQpT8aP3xJT1xrOh7A+GXLMrMlkYtmyZTx58oSaNWsmWGf//v00aRJ7OcKmTZty+PBhoqISHo8TERFBcHBwrIfIOI5euUK40UjXOOXvAVGaxsFLl2LKLt+7x72QEN6LU7cT5jf63nPWczNI84oVWfThhzioKrbAD8B0zCu+r8P8EW8LTHnnHUa3aQOYb+QqbzDEfCwQXaejprEn+rnZGAwcmjmTBqVKoQMDNI0tmkZV4ICmUUJRsFVVvujWjU/atk235/sq4aHh3DpxC/09PfZvpQZgyGPg3J7kn7u7N+5CO/7LmwByA83h+unrseqe23MOvYEeezGrbKC10zi958XDOV7l6NGN5qlJmz9XqABdwRQRxb17l2OKz5/fF/2v+O/6p08fcufO+ZgSP7+V5kUCErpAdNj3xz4SJR3Hzj558pQXnZDAwHsA5M1bnKlT9pEzTwFUOxXtO1PMBaKtMaG4qWRzz86YzWN4vcfrjNk8BltHR/N7ZzrwK+aOzl1AHsAAjRv3o3//nwE4d24PqupJ/BPyHv7+ZwkNDUzbFwG4d+8yISH34AW/sc6d2xtTEh4eyq1bJ9D194h7gRgMeTh37tVjg9PbuXN7MBjKQ5zfWJrWMV681nA+RMZm8WT25MmTZMuWDXt7e/r168fq1aspVapUgnX9/f3JnTt3rLLcuXNjNBoJCAhIcJ8ZM2bg5uYW8/D2TtpyhsKy3J2dAWKtkPX8z9mzZYspc4vuaY9b9zbmz3uP5+pag6716nF5/nxsHR35CHM/hAaMBoINBg5/9hljnxs+4+HszF1dJ+6fbTcAj+e+ZcibPTtbxo+nf5MmTAeuASbgG8wre/pNn87gli2t6mtJG3sbbBxs4p+8ENAeazh7OCe7bVtbW7iewIarYO8Qe55QZ3dn1Buq+WQ87zpk80j++ydbNg94AjyK3y4KuLh4/heDs0f0vxJ+1zs7u8eUeHh4vawq2fNlT3yQ6ZTQmjvYEj4hBsN/78nChaswe+a/FPWugTrIEHOBKGNUcqoF+HzW6Zje+gpNK/DDAn88XPLCECAM85t+BnBTYdyYv+nde0FM287O7uh6CAmdEIPBDnv7tP/WzsnJLfpfCf/GypbNI6bExsYeGxuHBOqGoGmPn3vPWA9nZw90/S4k8BvLyckjTl3Lnw+RsVn806x48eIcP34cPz8/+vfvT7du3Thz5swL68f9quHZKIkXfQUxevRogoKCYh43b95MveBFmqtcqBCl8uRhuKrG/Bq/DQxTVYrkzEmNokVj6ubx8KBJ2bJMUlWeDUR5CHygKHg4OvJGpUrpHP2r5c2eHVNUFMWAqpiHUuYANJOJQnH+cOtSty73NY2RmBcN1YGtwI+KQtcGDWLVNagqUSYTORWFcUAORSEQMGoaNgZD2j+xJLKxtaFOpzqoX6jw7D61UGAgKFEKr737WrLbrvZmNfgTWIz5rwUjMBc4BvW71Y9Vt163emgnNfNSqEbML/LvwDp4vevryY6hQ4eJ5mN/iHm9YoDDwEzImbMA2bL9l3RWqNAMZ+ecKMoA4Nkf6RdQ1XGUKFGPnDl9Y+rWqdMFg72dOYF7/gIZDKqDgdd7JTHmV90slgqKFKnEi05I5cotY9V1dHQhJOwhWhETanUDanEbdE+NoJB75tfsueERTk6uRGmR5ovoLSAv5s49TSd79tgLkNSs+TaqqgADeP6EqOpsatZ8O10WevDwyEPZsk1Q1Unw3G8sRfkAR0cPKlV6I6aujY0tdep0QlW/IO4FoihRvPbau2keb1LVrdsFTbsPcX5jKcqPNGgQ+6sEazgfImOzeDJrZ2dHkSJFqFKlCjNmzKB8+fLMmzcvwbpeXl74+/vHKrt//z42NjZ4enomuI+9vX3MbAnPHiLjUBSFpUOGcMfJiUJAMYOBAorCVUdHliUwb+r3/fph8PSkFFDUYCCforDLxoZlQ4fi7OBgkefwMn8dP84To5H9wGlV5YGtLRsxf7x/vmFDrLplfXyY27078wAvVaWAwUAToEaJEoyNM2TApGms8fPjga6zwd6emuXLszB62worndXgvc/ew7ugN9QEQyEDqpeKukTlg18+SFoPYxz9fuhHzoI5oRvgBeQChkCBigV4Z8o7seqWb1KeViNbwShQvVQM+Q3QCWq0r0Hjvo2THYOPTxmaNx0If0Qf3weoCjZhDowZvSlWXTs7B4YNW4atrR+Kkg+DoRhQAg8PEx988FOsuqqq8lH/X+GcYh5wXRDwBf6FD37oj41NMlYsT+PxsxMmbMPePhtxT4iLS04GDYp909OdOxe4c/0c7AfPW/nxoSxshPAnoZw8ue2/eJd34MGD64QGB8B5YIeC4xNX8+utw6pVM2K16+6em48+WoSqrkBR8mAwFAaqki9fXrp3/zxNn//z+vX7Hk9PA1AKg6EoipIPG5tdDB26DAeH2N9GvPfeZ3h7FwRqYjAUQlW9UNUlfPDBL2TPnsQbE9OBj09ZunefC8xDVb0wGAoATShRogZt246NVddazofIuKzuBrCGDRvi7e3NwoUL420bNWoU69evj9Vz279/f44fPy43gGVyIWFh/L53L+fv3KGIlxedateOGVYQV3hkJMv9/Dhx7Rr5smenc506MTeJWZsOn3/OCj8/CuXMyT9TpuDq5ETDyZM5eOkSFQoU4NisWfH2uXj3Lsv27iUkPJz6pUrRrEKFeEn9kStXqPLxx9QoXJilQ4ZQIGdOFu3axYAffqC0jw8HZsyI125qSm4+ZDKaOLzuMOf3ncfF04U6neuQwydHiuPRNI1tP2xj58KdqAaVJv2bUKdznRfWv3biGn4r/DBFmajUshIlapdI3g0ocV6IS5cO8b//jSc4+AElS9blnXem4uCQwPu4w3KCf3qdPXuWEBBwAx+fctSq9YIeqg7LCbwTyJKRS7h97jZeRb3o8mmX5L1u6XQjmMlk4vffR/PPP0tQFJXGjfvSrt3YePX+/PNrfv75I+rU7cL7veZja2vPsmXjWLduFi1aDIpOlsyWLBnN2rUzyebqyaQJu8iTpzizZ7fm6LGNeLjn5bvvbsdr/+HDW/zzzxKCgx9QtGh1qlZtjY2NbVo+9XgiI8Px81vOtWsnyJ49H3XqdMbNLVeCdU0mI4cPr+P8+X24uHhSp05ncuSwjptaX+Tu3Yvs3buM8PAQSpWqT4UKzV44xMkazoewHhlmNoMxY8bQvHlzvL29CQkJYdmyZcycOZM///yTxo0bM3r0aG7fvs3ixYuB/6bm6tu3L71792b//v3069dPpuYSCTp54wal8+e3qrGhcR2/do3Nx47F3OT1zI/btpHXw4MWyRwaER4ZycajR2lVpQq2z/XOXfb3586jR9QpWTJFcb9KBlpYKm0l54V49jV/YvZNwZCAGydvkL90nOvjBce8ffscOXMWiJlFIb08enSXGzdOUr587Bt/L1zww9nZnXz5SsSUPXhwna1bv+PttyfH6pE+cGAlERFh1K3bJd3iFkKkXIZJZnv16sW2bdu4e/cubm5ulCtXjlGjRtG4sfnrvO7du3Pt2jV27twZs8+uXbsYMmQIp0+fJm/evIwaNYp+/fol+piSzGYNl/z9KTZoED/160eP15M/1lEkjySzz0nKixE3OX3ZvilIZP0v+TOo2CD6/dSP13vEuT7iHPPp0yB69/aiTZvRtG8/PtnHFEKIpEhKMpuMAVWp56effnrp9oSGGtSrV4+jR4+mUUQis1jp54eu6yzft0+S2XRmrYnsrbO3OLrxKKpBpVrrauQqmPBXuQAPrj/g4OqDmKJMVGheIdbCCgl69qSfTzDjvhCJST6f2yci4ikH9I8IuBmAbzlfKjaviGpI+FsGY6SRw+sOc+fCHbyKeFH1rarY2r/461m/lebrY9/yffGT2Q7LY8Vx5MgGoqLC2bNn+SuT2cuXD3Py5DYcHJypXr0dHh55Xv2cE+HBg+scPLgakymKChWa4+NTJnkNJaXXOxNIq/MhhLWxujGzaU16ZrOGaqNGcerqVYyqyv2ffoqZ4kukLWvMEXRdZ+GQhWyetxnFSQEN9Aidtye9Tftx8ReNWDtrLUtHLwVbUGwUtCcajfs1ptc3vRIespJQ0vqiF+JlCe1z+1y6dIjpnzYjNDgQ1UNFC9TIWyYv4/8aT/a8sW+Gu3vxLlOaTSHgSgCqp4r2UMPDx4Nxf44jf8mEV3gbVW0UV09dRTWq/HT/J5zd41wfz8Xy2WdtOXToTyCMuXPPkzdvsXjtGY1RfPl1Z/z2LUfNZkCP1FE0ld69FtCw4fsvfs6JsHbtLJb+/jHYKigG0J5qNG7cl1695idtCFFSer0zOKMxii+/fA8/vz9QVRd0PQJF0ende36Kz4cQ6SXDDDOwBElmM6exy5bx09atMT/7h4TwGTACyO7oiF30GLpS3t5smzjRIjFmBdaYH+xZuocvO38Jn2OeGssIzASmwNitYynXqFxM3TO7zzCx3kQYBYzDvCrF98BH5pWm4vViQsqGESTQjtEYRf+PvAkuEoD+u3nVKw6A2k6lbLmyfLLpk5hddF1nZNWR3Ay9ibZcg7LAGVDfVsmj5uHzE5+jKArLxi5j60//XR8h/iE8u0AcsztiY2e+PrxLeVOzXU3+9/HGmLqhoffR9Qkoyizs7W2wtTXfhObunotPPz2EjY2dOeH842P0n3XznP+hmGdk+kFhzuyTeHvHX548Mc6c2c3EifUSPh/9f+b113vE3yk5wy+s8Y2bAmvXzmLp0k/Q9Z+Jc0KYMyf550OI9JQhVwATIiXqlixJeFQU/iEhlA8JYTbwEbAEaBcWxr2QEO6HhtKkQgXLBirS3d8//Y3SUDHPxWoHOAGTQC2nsv2n7bHqbv9pO2oJ1TzZvnN0/QGgNFf4+6e/0yXeEyf+IujhPfTvoxNZgOqgTdU4sfkEgbf/Ww3p+r/XuX7kOtrn0YksQCnQ5mrcPnmby4fMK4uVrFuSqPAoQvxDCCkfwvMXSFi7MELuhRB6P5QKTSpQpFoRVFUlJMSfkJCC6Po0YCC6vozw8B6EhDwkJMSfMmXqYzCYhzJs2bEAvbNuXszKgHm1s69AzWFg586FyX4ttm//CbW4Tfzz0Uzl7x3fxd8hHVcys2ZbtvyIrncm7glR1ZwpOh9CWCtJZkWm0KR8eY7PmcNrRYuyFSgE2AO1gBWqSj53d7ZPmMCo1q0tGmdmZq2dW4/uPUIvEecLKAW04hqP7sVecSjofhBaMc082f5z9BI6j+8/TnkwiXiRgoLum/9RPM6G6J+DH/y3JHfw/eCE60bf5B90Pwgwz5875/gcir5WlLgXiLpCxT2fOxO2T6D1qNYUrlKYOXNOUKnSm8B+wAVwB2qjqitxdMzG8OGr6dFjXsx0ZSFBATHHjGEHFNL/ez7JEBR8D624Mf75KKnxODj2nOOSyP4nJOQ+LzghKTofQlgrSWZFpuGbMye/DxmCBtwH5gO3gEeaxowuXaj3gmWSRcpZayILULxacdT1qnmJ02cegbpVpVi12OM/i1QtgrpD/W/hLYAIUNepFKsaf6wokPQk6hUvVpEiVc3/WBFnwwpwcHPAq6hXTJFveV9UWxXihrAcFINCwYoFY4py+uZkyO9DiHuBaI80uszoQql6pWLic3XNwdChf2Aw2GN+MX4ELqHr92nTZiTVqrWOdbjChauirjSYl5B95ipoh7X/nk8yFClcDXW7If75WGtDsUK1/itLaSKbyRLhwoWroqqriHtCNO1Qis6HENbKorMZCJHa1h0+DMBUReGWruOhqjhqGusOH6ZL3boWji5zsuZEFuDNYW+yZ9ke9Ho6+kAdokD9XMVesafph01j1W3Svwl/LviTsDphaMM1cATlawXllsJbK9568UFedtNXQp6vGyeR8vEpS+Vqb3K0zwb0CzpUBjYB30Grya1wcP5vrle3XG406deEP8f+CQ+A+sA/oMxVaNCrQbyV0w6vM18fylQF/ZZuvrnMUePwusPU7VI3Vlz//rsVkykCRfkRXb+Fojii604cOLCO1q0/jtVu+zbjmTylAUpTBb2PDgGgzjLglj03devGXro0KYljk9r5+bOcQ/zzcVvnrZUVoUIqJqFJPYdWrH37T5g8uSGK0gxd7w0EoKqf4eaWL/75ECITkJ5ZkamsjF4Jzi1PHnZNnEi9SpUIAzYdOUJYZKRlg8uEMsJnv3dpbyb8PYGCakHzEMKeUDxHcSbtmEQO79irZHnk8WDyzsmUzFcS3gc6QwFjAcZtGUeBCgVefqDk9u4l8CIO2fkOTXs2xXaOLbwFLmtc6DKrC+3Gxl8cptvn3Wg3ph2OvzhCK3D43oG3hr9Fr697xau7f6X5+sjjloeJuyZSqV4lCIMjm44QGRb7+vDzWwmAu7vK2LFbeP31LsAjLl/eT2Bg7NW0Speuz6iR68lzsRi8AwxQqJCzGVMm7MHJ6bkbN5L4GqXofCRHJumhLV26PqNGrSNPnrtEnxAqVCjLlCk7Y58PITIJmc1AZCp1xo6lrK8vs7t2xcneHl3X+XbrVj5ds4b906aRx8PD0iFmGhkhkY0rOCAY1aCSzSPbK+s+efwEU5QJ15xJ/PBP7guTQCIVGR7Jk0dPcM3pisHG8NLdjZFGQh6G4OLpEjM7QVxj64zFt6wvXWd3xd7JfH1s/XYraz5dw7T90/DY0yem7uefvwMo9OmzgGzZzNfN/v3L+fXXkYwatRZf33Lx2td1neDgB9jaOrw4aUpmwpjs85EcGfHNnYBEnQ8hrJRMzfUSkswKkXKZ5LM+7aRkGdt0YIw08n3f72k7ti1ehf8bg2uxE2uNPaLyJhfCojLMCmBCCOsnn+nJYOXjL//9+192LtyJay5XunzaxdLhmF8ra0xohRAZgiSzQogEWXEulmQPrj9gxeSVHFp7DFVVqfVOVdqObYt7bvd4dW+fv828d+dx/ex1dF0nt09u+v3Qj9L14080Hx4azpqZa9i1aB9hoWGULd6Y9u3HJfgV/EulMJH7ZdAvbFu0jcinkdg52lG/c316ft3zhStkHVh5AIB9fxyi88zO5im2EjjhFy74sXLlNM6f34+zc3YaNuxOq1bDsbGxi1f30KG1/PzzQB4+vIuiGChSpAJDhy7H0zP+KmQPHlxnxcrJHDq21nw+qr5D27rlEjwfacUYZWTjFxv5++e/CQkIoWi1orT7pB0lXos7pVXm9+DBdVasmMKhQxtQVQO1arWlbduxuLvnTrcYjMYoNm78gr///pmQkACKFq1Gu3afUKLEa+kWg8i4ZJiBECKezJTIBt4OZGTFMYQ+skMzdgciUQ2/kMPHkZlHpsYaP/vw1kMGFBuAycYEvQBH4GcgECbvmBwr0TFGGZlYbwqXDl5DM3UDcqOqS7GxucPUqXsoUKBC4gJMYSI7661Z5lkKGgOvA7uBP6Fck3KM/WssYF7y9tkCCgA/frCQp0HFgMN0n9sd1yuNAciRwzcmeTh9eidTpjQBSqBpHYCrKMpvVKzYnFGj1sTMMQvmRPazz9oB+YFumOfS+hk7Ozt+/PE2Dg7/vcaBgbcZOaYioXaP0LobIRLUXwzkyOHJzAMzEzWeOaV0Xefzdz7n4OqD6J10KArqShVOwZhNYyjXOPqPkcx0IbxAYOBtRo6sSmgoaFo3IBJVXWg+HzMPxIyXTku6rvP55+9w8OBqdL0TUBRVXQmcYsyYTZQr1zjNYxDWR8bMvoQks0K8XGb7/F48bDGb5u1FM50FnvU0XUZRS9Nxejtaj2odU3dW61kc3ngYTvHfQgQPgBLgnc+bOf/Oiam7f/l+vnj7C2AX8GzatyeoahUqVizOqFFrEg4oFb9OD7wTSD+fftAf+Oq5DcOBL+CbK9+Q0zcn3/b+lu0/PrfamWILuh+q4S00062Y4ty5i/DVVxcBGDOmFpcv6+j6bszryAKsBNozceJOSpWqF7Nfv34+BAYagH8xL7IA4AfUpEmT/rz//vyYuosXD2PT3nloZ03Pnw6U0iodJ70b63yklQt+Fxhbc6x5icBO0YVGUBoqeId6M/vI7P8qZ7YLIo7Fi4exadNCNO0Msa4PpTQdO06idetRaR7DhQt+jB1bk7gnRFEa4u0dyuzZR9I8BmF9ZDlbIUSyZMbP7WObT6GZ2vHfBzVAYXStKSf+Ohmr7oX9F6ABsVfUygl0hNuXY09HdXLbSQw2JfkvkQVwRtO68e+/W18cUCq+yHuW7DHPi/9BnA39AQ12LtwJQI95PWjUp5F5m9IC9NtAJTTTFWA0oFCsWG0mTNgGQHj4Ey5d2h89R6ntcw23RVVz8e+/sZf2DQy8C3Tnv0QWoAZQPt5rcezUZrR2prinA72pxokld5P4CiTPyb9Ponqo8O5zhTag99G5cfQGoY9C0yUOa3Ds2N9oWlviXR96U06ceMn7OBWdPPk3qupB3BOi6324ceMooaGPXrSrEIAks0KITM7B2Q54GK9cUR/ikM0+VpnBNs5qU88EgMEQe2oseyd70IOJvcoSQCB2ds4pijmxnNycnh0ybgixtts72dPnuz4M+d8Q0DdhHjsBcBSYQfPmHzFp0g5y5PABwMbGFlW1TaDhMOApDg6xn5+iGBKoqwEPsbV1iFXqYOec0OlAeajiYJ/2QwzA/HroYTo8jbPhISiq8sKpzTIjBwcn4p87UJTAeOc5rdjbO6Hr5vdWbA9RFDXBMdpCPE+SWSFEplanSy1Q1gFbokt04A90bS+vdawVu26nOub8bnF0NYAdwEooXTv2DWC1cozDZLoNzMKcuAGcQFV/oE6dd0kP9bvXR7VX4WMgKLowBBgFip1C436xxxq6e7lH/ysQ1VAQWIeiOOLqmhOD4b8EzsbGjurV26KqXwCXoktNwHg07Qk1asTuXS5UqCzmJW+ffR2sA3OBWzRu3DdW3Tq1usA6Je7pQN+r8Vqtjsl6HZKqRvsaEIW5U9oYXXgV1DkqlVtVjrXKWmafZcH8Xl1LvOtD38Nrr6XP+7hGjfYkdEJUdQ6VK7dKt6RaZFySzAohMrXG/RpTtkEZoCmqoTyqTWngXWq+/Rq13o6dzL47/V1yFc5lvoepGFAeaABOrk4M/G1grLpFi1andevRwBgMhiKoag2gInnz+vD22xPT46lhY2dD18+6wn4gD1A7+v+7oPPUztg5xO7RejaLAcyiYCUbFGUmuh7Gvn0r47Xdtetssmd3AEqgqq+hqr7AHLp2nYOXV+FYdYcNW4mtrQGognn93YLAMAoWrEyzZgNi1W3cuB9lyzSApqCWN6CWtoF3oeZrb1Or1tvpMtYlh08OeszrAV+DwdeAWltFKabgrrjTY26P+Dtk4oS2ceN+lC3bEGiKqlZAVcsA71Kz5rvm85EOcuTwoUePecDXGAy+qGptFKUY7u4KPXrMTZcYRMYmN4AJIWJkxjGzACajiUNrD3Fk/RFUg0r1ttWp0LxCglNXaZrG6umr2f3bbjSjRuU3K/PutHdxcIr9dfmzF+vcuT3s2bOUsLAQSpeuT+3anbCzc3x5QKmcHF06dInfRv7Gg6sP8PTxpMunXShWs1i8egMKDSLw9kO6z+tK476NOTs5N3PnduHx41t8++0tsmfPF6t+WFgIu3Yt5sKF/bi4eFKvXjcKFaqUYAyhoY/57bfhnDq1Azs7Bxo16kezZh8m+BqbTEYOHVrLkSPrUVUD1au3pUKF5rHrpkMCee34NXYu3ElwQDBFqhWhfvf6OLm+4HMhs14cJPJ8pINr146zc+dCgoMDKFKkGvXrd5eVy7Iwmc3gJSSZFSJhyfmsfnT3ER55Ms4SwU+Dn6Ia1NhfIyfXcy+Y0RhJWFgILi6eidvXQj19e5buwbe8L96lvWPiDwl5yN69v9OwYW9sbe1f0UI6S+/XKRMnrEJkNLICmBCZhDV/tl46dIlPqn/C5D2TKV6r+Kt3sAIz3pyBWy43hi8fnvLGnlvl648/xvPPP0uZP/8qqmp49X4WUrtTbfM/nntjubh4xhsKkCVZ88UmhHgpSWaFsFLW/tm674996LrO3mV7M0Qy+/DWQ87vPo/B3kBYSBiOLq8YCpAYHZZz//p9NnX9iqjwp6w49y5vT0idcYaaSePU9lM8vPUQn7I+FKpcKNZCBcmWxDfW7dvnuHjRj2zZslO+fNOX9t4+eHCdM2d2YW/vRIUKzTPOjTvWfrEJIV5KklkhrERG+jzVdZ19K/eBDexftZ/uc7un+/i6pDq4+iAYwBRh4timY9R6p9ard3qFeZ3msfePvdGTGdiwYuIKNn+5me/ufoedXfKnE7pz/g4zWs3g3oV7MWWlGpRi+Irh6bJCFpiHTnz9dQ/27VsaU+bi4sWIEcspUaJ2rLqaprF48TA2b/4SXTfP7ODg4MaAAQupVq118oNY3iFT33wlhEgdMmZWCCuQERLZX0f9yvGtxwHQjBq3T96GccAUyFsmr3mOVqBMvTL0+CKBO8LT2ZWjV/iu33cYjeapfh5ef0hY9TCUewrOt5xxz+cOgJ29HQMXDyRP0TyJavdp0FNmvvEZAdcDCbgZAPYaGLOBqSPYfg9RBmzsbclb3IuO0zpQ+Y3KSYpbM2kMLDmQAJsAtJ81qARsArWnStVGVRn2v2FJai+eRL7Zli4dw9q1c9D1+ZhXZbqConyAvf2/LFhwFWdn95i6f/01n59++hDzNGX9ME/WOwxV3cDcuWfjzX6QZGmd0GaEC1CILEbGzAqRAWS0z0/PvJ7cOnELXdPhDaAVMBZQ4M6JO+apKhWo17HeyxtKJy6eLoQ+CuXBpQfgDbwD9AD9iU7IHyGErAyBB+Bd3htnj8R/HW7naIfB1kDAzbuAE0R0ApoAlSHKBtiJMeIUgbcCn5vXNfFObT/F/Yv3zdNt1YgubA3aHY2DHx3k8b3HuOdOertJoWkmtmz5Dl0fAPSKLi2Nri8jPNybvXuX0aRJv5j6mzcvAN4GRkSXuAC/AfnYseNnOnaclqbxpthz45+FEBmPdX8vKEQmlRE/N1sMasGEHRNwz++OuleF9oAd0AHUPSpued0Y//d4Wo1oZelQAcjpm5PZR2dTt2tduIk51qpAfVCCFXgAzQc2Z4bfDFxzJH76Hxs7G8ZtHYONvQ0QBoaTQGugEFAUOAWofH56FoWrJL1HMuBm9BJkcTt0K4Ou6Ty6k/ZLe0ZEPOXp08AEgsiDwZCPgIAbsUofPryRQF0noBQPH95MeUDLO/z3SCsynEGIDEuSWSHSSXp8Hqe1UnVLMfx/w9EeaXAVWAFcA+2hxuAlgynToIyFI4zN0cWRAYsGUKRGEZRTChwE/gX1lErlNyvTY16PeAsLJIZqUMlbLC8oOnAauAb8DZwBWxVstWT1ygL4lDEvKcvmOBs2g42jDbkL505Wu0Ci33wODtnInr1AAkGcwmS6gY9P2VilPj5lUZTN/LdsGsA9dP0I3t6p/J6QhFYIEYcks0Kkg4ycwMZ1YssJANQxqrlXdrj518i/W/+1ZFgvFBoYypXDV9Bv6VADlMoKpicmTu06RVREVLLb/XDxh6DbgMkN1PJAY2A3RGmUqFEi2e0WrlqYEvVLoPZQ4VvMCfgkUKYpNO3f9MWT+r9KEt6EiqLQps0IzEMFPsI85mEpqtqKnDkLU71621j127QZia7vBLoA/wCrUdUmODm58PrrPZMX78tkpgtKCJFikswKIZJk38p9AOQiF0NXDMXL1guAvSv2Yo33kx5edxjNqKFcUug4rSOthrWCyxARHMHJbSeT3a65R9cI3AYtLLr0PACl6pVKdruKojBy1UiqNKiC8qEC1cHmUxtaDGxB55mdk9doMpK/Jk3606XLLBwdlwC1gM6UKFGQCRP+jjc9V5Uqrejf/2dcXLbD/9u78/AoqnyN49/qBJIQkkACgeRC2FR2AQFlF0TZBHdGuDiKOIiCijC44DKiAyIjKqMoCIOgIooMqygO4iUgi0KACLKEMCyBAEa2hBBISKrvHy2RkEAWulNdnffzPP086erq6l93V3W/OX3qHDoB91CrVgCvvLKC0NAqJau5MAq0IvI7nQAmIkVmmiYnD57klr/cwsBJAwkMDuSGXjfw8V8/Zs1na8g5n4N/ee/6WEnZl0LVulUZ/tlwrmvjmuK1ademvPfQe6TsSynxdn/b/xtBIRV45P1BOPwcHD90nMadG/PhkBlXtV2AipUrMmreKE4dPcWJwyeoXq86FcI83yJ7McMwuOOOZ+jR4wmSk3cREhJBlSoxl12/S5eH6djxAQ4d2kFgYDDVq19TsnqtppPBRGxHQ3OJlAJf+m40c0wcfvl/1Lncck9bPnU5ta6vddmJG0zTNe7ppePgmjkmhsNwTURw8RtUjH6TF57zng172LNhDz2e6IHT6cRpOi15LQrkSzvfpTzZx9WXXzcvduRIImvXfsG9977knklCxLaKMzSXl3zaiohdXC6kWRHezpw6w0dPfcTcMXMvu47D4ShwQgeHn6PgL8tihJgLz3nea/OY+fRMTh8/jWEY3hNkRWxm6dK3+fLLv3Hw4HarSxEb8a7fA0V8kBp4PGfT0k2Y5012rNxB+ol0KoZf/exY586d4dsB/2Xdhrlk52TR6v7r6D2yN6FVC24ZyEjLYOt3W3HmONm4eCO3DLrlqmsoru2x2/n6nW84tPNXoutH0mt4D66/9XrtfGIrppnD+vULAfjpp/nExHjX6CjivRRmRTxAGcIzMjMySfwpMXcEqJUzV2JcZ2Ammnw96Wsad24MQGBIIPVa1Sv6z5S/95PMyjrLq2O7sPfAJpx3mxAEh99PYM2Xaxi/fjxhkWE4nU72btrL2TTXSV+71u4iJysHo75B7MexRNaOdG3TgGtuvIbA4EB3vwx5xH4cywcDP8Dhdz1mzl2k7P2BzUvH8uij07j1Vo8+tG9T39lSkZT0C2lprj7mhw/vJj39V6ABa9bMpWHDjrnr1a7dgooVK1tUpXg79ZkVcTN9/3nOdx9+x/THpuddOAkcSxyY/2fmWTw1eSrh0eHF2/6jJ5g+43FY74Qbf1+4HxzN/OjdeSQPPPAP0tKOMXhwZJ6RGxztHZgPmPB43u0NnDSQXsN7FauG4sg6m8WjUY+TkXon8Alg4Er6fyEg4N9Mn36YwMCiz25mO6UxLqwOaI/Jycnm4Ycrc+5ceu4yh6M2pvkurikG/9Cnzyj+/Oc3S7lCsZL6zIpYRN97ntVlUBfufO5OAIxGhmv406fAXGrCTDAqGlQIr8CohaOKHWQBNh+djnEzfwRZgNpg9sthwxbXz5+hoVV49tklBFcJxqhgwDQwl5swBNeYsNe77tb7r7257bHbruLZFi7xp0QyUk/jmkb2Qiu0ATxDZmYau3b94NHHF7kafn7+vPjifwgPr4Xrh+I3MM2fcc2XvQPXMG/QqdOD3Hff36wrVLyewqyIG9h9Zi+78C/nz4A3BvDS8pcISA6AN3FlN39gCNRpWIe3fn6LG++6sZAtFczh53ANHXupTHA4/HKvtmzZm7fG7uaamjfBUMNVgwG8DQH7Ahj9zWgenPgg5QLKlaiOYtULQNYlt7iuOxw+3pNMB53t1a/fjrfeiueGG3oCzwMncB1MH+FwrOOJJz7liSc+JigoxNpCxaspzIpcJX2flr4GHRqQk50DVcC43YAXwNHAQZWaVYioEVHi7d50z004f3DCfy5auBUcXzpo17pfnnXDw6OpWqU2jmsc8BoYPQyoDDnnc2jYsWGJayiOa9tcS0iVymC8yh+B9jzwGsHBVfL0OfRZnv5PUlPcelxwcCVq1GiAw1EFmIthdAb8Mc3ssrEPy1VTmBW5Cgqy1vh5+c+cP3MepkFofCh+7/phbjXZvGwz586cK/F22/VrR7OezaAHGF0M6Oma/vZ/qjeid+8RedbNyjpH3ObFmLtycLzpR9gvYTAFss9ls2XZlqt9ikXiX86fx2cMxuH3LQ7/usD9OBzXYBiLGDJkSr6ZuqSEFGg9yul0sm7dfEzzGPA84eH7gTcA16gGIoVRmBUpIQVZ68QtiQPgpr43MWn7JF7/8XWqXVeN7LPZbFtR8ilq/cv589zi5xg6cyjNg5vT1GzKQw+8w7hX11OhQliedXfsiCXr7FmqRtVm3NgfmbR9Eu36twNg4+KNJX9yxdTqjlb8Y/Mb3PJIQxp22kGXLt2ZMCGONm3uK7UaRK7GoUM7OHZsLyEh1XjppeX885+76NVrOAAbNiy2uDqxA41mIFICVgdZ0zQxs02vmzq2tGxYuIFzZ87RcUBHcrJzcPg5yMrIYunbS+kwoAPV61V37wMW8IanpOwnNnYWffr81dWfr+88VwvT3HX4+fvR5r42ee9r4zPvMzLSCAysWODkE17D06+v1Qe9Dzt9+jhff/0OPXs+RVhYZO7yLVuWceJEMl27/sXC6sQqxRnNQGFWpJi84TttwbgFrP50De/sfKtMT/nodDp5psUztL6jNfe/dr9nH6ywN76gMHXpfWw4/WpGRhoPPxxOhw79ePLJ2R55DLew8T8LIpKfhuYS8WFOp5P/++gHDiccYu+mvW7d9sHtB9mybAvHko65dbuekrQtiaSfk1j56UoK+788MyOTbd9vY3vsdrKzChqy4A/Z57PZsWoHW1ds/aMPrjvCkqfCkAdD1tKlb+N05rAxbqnHHsOdzByThHUJxP8nnjOnzrh34+o7K+KVLP2Ncvz48SxYsIBdu3YRFBREu3btmDBhAvXr17/sfWJjY+nSpUu+5Tt37qRBgwaeLFfEKxzcfpCUvcmAwY///pF6repd9TZPJJ/g7f5vs/uH3a4FBrTr346h/xpK+aDyV719T/nx3z+CASf2n2Dfln3UvaFugeutnLmSWX+dxdmTrlm7QqqFMGTKEG68O/8QXpuWbmLKoOmk/XYCgMCKwTz41gBuffTW4s8KVdD68/raKhStWfMZYHDubCoHDmylVq3rrS6pYPP6srvGOCb1m8yxpKMA+AcEcO9Ld3HPi/eU6V8wRHydpWF21apVDBs2jNatW5Odnc2LL75It27d2LFjB8HBV561JiEhIU+zc9WqVT1droglvzKeO3OOqX+ZSkaqK4gdP3gch18IZs5dfPfhIg5sTQLAMAzufPYOGt3cqFjbdzqdvH7H6xxKOQQLgRuAb2D9X9cTWCGQx6Y/5uZnVHK71u5i4fiFua2wezbsgX7g+I+DyQ9OpkqtKgAEhQQxZNoQKoRW4JeVvzBl0BR4ENfcAufh9GuneftPb/NG3BvUblY7d/uHdh5i4t1vk5NzG/AaEMS59LeYNmQaVWpVoXn35u4LtAWtVxQeDsNffPEyK1Z8eGHGYE6nncA1I8R0XnyxLQG/zyhWISiUd97Zgb+/d/yzk5qawtgH3yQzqxEwD6hGdua/mPvyP6gcXZlbBt1idYki4iGWhtlvv/02z/WZM2cSGRnJpk2b6NSp0xXvGxkZSaVKlTxYnUheVnWXMwyDQ9uPkrRtL1AB6AZ0B9qTceos8cu2AQmUCwykz6jexd7+zh92krQ5CVYAXX9f+Bg4TztZ9dIqHpjwABXDK7rr6Vy1Hat3kHk6E64FbgaeAbOryaGlhzi04hCkw/80/Z/clrhv3v0GRzMH5izzj0myvgTjGoPlHyzn0Q8fzd328g+W4yQCnAuAC8Na/QuH31a+fnuZK8zCH2GyqCd3FSUAFyWkXtjGxeu6ecfMyckiLe04YOKazqwL8BxQh6ystWRlLQPOk52djWmaV9pUqVq5ciaZmZk4nV8BF8YangBGIl9NXOa+MFvcf2ZExOO8qs9samoqAOHhhU9D2aJFC6KioujatSsrV6687HqZmZmkpaXluYgUl5XfXQEVAnh9w2v0Gt4LyMBwmMBgoClwB4axl1rX1+XNn9+gSZcmxd7+0T2un2S5+ZIbboacrByv6j/boH0D3tzyJnVa18HY5xoHlhbAw2D4G5AO3YZ2Y8JPEwgKCQIgOTEZs9NFQRagHOS0zSE5MTnP9g/vPoKZ3ZY/giyAgZnTmeRdv+YvqO+8oreSFmW9K+1oBbXuemDHHDBgAk89NRs/v0BgN/AAUBt4EtfsTNk0bHgz06cdpnz5QLc/fkkdPboHh6MJfwTZ3zlv5tf/HnHvg9mom4hIWeA14/o4nU5GjhxJhw4daNLk8l/IUVFRTJs2jZYtW5KZmcmnn35K165diY2NLbA1d/z48bz66queLF18nDc0wpQPLM/ASQMxc0z+88F3QArwG7CSihEVeH3D30s8dWr1a34fxmo1cHHj1WpwlHMQUbPkM2p5QvV61Rm3ZhxD6w7l1P+dgptwzQS23OCWwbfwl/fzDuMTfU00v/7wK6bzokB7HhzrHUR3j8677nVR/PJ/6zGzM/kj0Dpx+K0iun4kpcILdrgOHfrTsGFHHn88BlgDRAPhwFoaN+7CK698b22BBahe/RpM8zPgOHkCrbGayLpR7n9AtdCKeA2vaZl94okn2Lp1K59//vkV16tfvz6DBw/mhhtuoG3btnzwwQfcfvvtTJw4scD1R48eTWpqau7l4MGDnihffJS3fVft/CERp1kNh19zoDmwndPHUknZl1LibTbs2JCYFjE4BjpgEXAQ+BCMVwxufvBmQiK8b07044eOcyr5FCQCzcBxvQOzisnO9TvzrXv7U7djxpvwMLAdiAfuBw5D92Hd86zb7fFuwDEw7gU2AzuBRzFzNtJ7ZC+PPidv89NPCwEnrv9yWgGdgKocSCr5pBSe1LnzQMqXL4dh3AmsBfYAz4NzAXeM6mlxdSLiSV4RZp988kmWLFnCypUrqVGjRrHv36ZNGxITEwu8LSAggNDQ0DwXETtK2Z/CgZ//C+ynUefq9B1zH4ZjEwA/zf+pxNs1DIPRS0ZTL6Ye3A3EAI9D2zvbMujdQW6p3d0uPF9jk8G9L95L01ZNYS8c/uUwh3cfzrNuk1ua8NiMxwhcHAhNgBYQvCaYEXNH5Dn5C6BGoxqMWjCSkPB1QEugEQHBc/jLlL/QvEfz0nhqJXOhu8PlLiWwcuWM3//aQPPmPQkISANSSD99jN9+O+C20t2lUqVqvPTSMsLDDwMdgGvx9/8nf/rTq3QJ+cDq8kTEgyztZuB0OnnyySdZuHAhsbGx1KlTp0Tb2bJlC1FRHvgZScSL7I/fj8Pfj/99vT+9/9obh8NBs+7NeOdP77Evfv9VbTuiRgTj1owjaVsSxw4eo0ajGkTWLqWf1Utgf/x+wmPCeXrO0zRo3wDTNFn27jJmPzub/fH7ib4ub/eBWwbdQvt+7UlYm4DDz0H99vUv2y2jVZ9WfHi4OQnrEsg5n8N17a4jMNh7+oaWSAl+Ek9J2Y+ffxBPD/+Mm266m3PnMhg79jZ2717Hzz//h1tvfbTwjZSy+vXb8f77ieze/SPnzp3mmmtuomLFyq4bPTEKhLoaiHgFS2cAGzp0KHPmzGHx4sV5xpYNCwsjKMh18sbo0aNJTk7mk08+AWDSpEnUrl2bxo0bk5WVxezZs3njjTeYP38+99xzT6GPqRnApKi87TvK6XRy5uSZfCMLnM88T875HAIr2jxwFcO5M+dw+DkoH5h3WKj0E+kEVw72zjFFPb1DFSeoFaGW48cPERwcTmBg3s/JI0cSiYq6trjVeQ9PnLzlbR8WIj7ANjOATZkyhdTUVDp37kxUVFTuZe7cubnrHDlyhKSkpNzrWVlZjBo1iuuvv56OHTuyZs0avv766yIFWZGi8sbvJsMwChwiq1xAuTIVZAECgwPzBVmAiuEVy2aQLe5jFCHQRUTUyBdkAXsHWfDOg1tEroqlLbNWUMusFMabv+tM02TDwg2smbOGjNMZNOnchG6PdfOqcWBLy6/7fmXG0BkkxiVSrlw52t3fjgfefAB/f68ZpMWlNHcotToWnTtfK199jUQsZJuWWRFv483fSU6nkw8f/ZC373ubjckb+SXoF+b+fS7PtHqGE8knrC6vVCX9ksTwRsOJ/z6eM23OcCrmFN9M+obh9Yd71UD+Xr1DFdXFoe8qTijzOr7w3ogI4EXjzIpYzdu/23as2sHKGSvhX+B8xPWDivOAk5M3nWTuK3N5/F+PW1xh6fln/39iBpoQB9T7feGn8NuDv7Fo/CLuedELuh15+w5VHJcG2MsFWrs9Zw9PDSwipUMtsyLY4zv4pwU/4VfbDy4eLasWmINNflzwo2V1WeHg7oOuSdDqXbTwAaAu/DD7B4uquogddihPsGMwLKvvlYgPUcusiE2Y2SbkP+cJyv9+W1niJP9rYQABXvBalPVwdHGgtfK1KChYl/X3RsRHqWVWxCZuuP0GcnbnwFcXLTwOjhkOWvZuaVldVoiMiYQZuGb0veA/wE648e4bLapK8vG2ltqC6vG2GkWk2NQyK2WeXRprmvdszg19bmDzPZuhD1AdHPMdBDmDuP/V+60ur1QN/WgoY24dA/WBvsAxYDFUrFqR+/9uwWthl53ICt7SUnuBwquIz1HLrJRp3vDdWlQOh4NR/x7Fw+88TL2j9Yj6IYrb/nQbEzZOIOrasjUDXqNOjRj7w1hqxdTCb44f5b8vz4133MjkPZPxL1/K/6N7y05kh5DmS6MhiIjX0DizUmZ5SwYRG/OWncgXAqInXsvSel28ZT8Q8SEaZ1bkMub1/eNSVmxYuIHhDYaTnZVtdSke8eqtr7L07aWl/8DeshP5QpAFTfggIiWmPrNSJlzpOy3rbBaHdx+mYnhFqtSsUnpFlZIVM1ZwJOEI277fRoueLawux60OJxxm+/fbOZZ8jN4je5feA1sdkkoxwJbq8eFt/WtFxBYUZsXnXe470el08tVbX7H47/M5nXYWgKadG/HYrGFUrVW1FCv0nIzUDLYu3wrAT/N/8rkw++N81/i6v+76lUM7DlGjUQ3PP6jVIauUguyF42P+6/M5e9J1fDTq2ohhM0rp+Og7z/rXWkRsQWFWfNqVvgu/m/ods5+ZzTDgf4G9wEs/7GJs5zFM3DWJcgHlSqlK93E6ncx9eS4nj5wE4OThk5jnTRgA6/69jou7yHcc0JEmtzSxqtQS2f/zfr5979vc5xG/PB7uAMdKBx8++iHR9aMBCAoJov/r/QmoEGBhtR5Qii2yF46Piw+QXS/vYsytY5j0SykdH74y05iIeJTCrPisK33fOZ1Ovnp9AQOAyb8vawc0zzFpuv83NizcQPt+7UuhSvdymk42LdvEgc0HwB8cLR0YTxg4n3KSdTCL2B9icSa6guC1N11ruzB76ugpYj+JxTxvYtQ0MGIMGAVmO5PERYkkzE2AM1C5ZmXue+U+3wqzpRhknU4nC/6xgEsPELO5yW9NveD48LZWW2+rR6SM0Qlg4lOKeoLXufRz/HroBL0uWd4EqFHOj6RtSZ4q0aMcfg7GrRlH92HdIRucUU6cE51wLZhvmBhpBhUjK/LCshe49dFbrS632Jp3b864deOoek1VjJMG5igTOgLPgtnahDPQ+u7WvBX/FhUrV7S6XPcp5ZO8zqWf48T+ExR0gPjFeMnx4W0nvnlbPSJliFpmxWcUp2EkoEIAIWEV2Jyawf9etPwIcDTbJKJmhLvLKzXlg8rzyORHCK0ayrwx8+Awrn9blwDHYeKBiYRHh1tcZcnVa1WPiZsnMrzBcE59fgraAMFg/Mug4587MuzjYRiGYXWZV8/CcBRQIYAK4RXI2JzBpQeIediLjg+dMCYiqGVWbK6kQ205/Bx0fbwbkx0GHwHngJ1AP4dBQHCALbsYXOrQzkMYVQ0c9zugLhAPZrZJyt4Uq0u7ahmpGZw6fAqOgVHXwHGDA2dNJ0k7kzwbZEsrMFncyufwc9Dt0W4Ykw0uPkCM/l58fGiqWpEyS2FWbOtqc0XfMX1p1bctjwBBQCNgW+WKPPvNaIIrBbuhQutkncti09ebcP7mJOJEBL1H9Mb4zhXyLowAYGcbFm5w/bESbvnzLdQKrwW7YX/cfn478JtnHrSMBNkL+o7pS9t72nLxAVJxV0VGf+XFx8eFGcasmmnMS947kbJG3QzEltyRK8oFlGP4F09z7yv3sXv9bkIiQmjeo7ktRzG4VNLWJLLSs+j0YCcemfwIQSFB3HTPTbzzv++w84edVpd31RLWJlAhvAJDZwzlxrtuJDsrm7l/m8viCYtJWJvg/qGjyuBP2OUCyvH0nKe572XfOz48SieDiZQ6TWcrtqPvicI5nU6SdyVTo2HecVfPnj7LmVNnbD85RGpKKobDILRK3ikOjyQeoWrtqviXc/P/6aW5013Uupd1Nou4r+Jo27etb/QDLiv0ISVy1Yozna1aZsXr6Xuh+AzDyBdkwTX+alBIkAUVuVdYZFiBy6OujSrlSjxr5cyVzBg2gyoxVbiuzXVWlyMi4pXUZ1a8moKsWM6infDonqMsenMRAJ899xlpv6W5Zbunj59mycQlvPvAu8x+bjaHdx92y3ZFRKyiMCteS0FWLFfKO2H2nZ+TfjKdVZ+sYniDERw/cByqwM51O3nq2hHs+GEH6SfTMXPMEm3/4PaDDG80nM9e+ox1B9ax9KOljGg0grVfrHXzMxERKT3qZiBeSUFWypy+83i2ybMc2n7oj2UO4J/AAMhIPc2YTmMA6PTnTjzxyRPFfoipQ6aSUSUDZ7wTZ5TTNeTWIJjylym06NmCCmE6j0BE7Ects+J1FGTFa5TyUEv9x/WnXMXfRwsYDqwF+gPLgLtci8Nrh9N7ZO9ib/v4oeMkrk3EfNmEC12LA4GJkHXGdaKZuImG6BIpVQqz4lUUZMXrlGIwaX1na/q92s/1yfweEAAYwK/AItc6I+aMoHbz2sXedmZGpuuPSyd/q+x6jKyMrJIVLQWzaqxbkTJIYVYsV9JZvER8UZt724CJ65IEDAPOum4LDg+jXqt6Jdpu9XrVqRxTGT4ELh6QcZrreuMuja+mbBERy6jPrFhKAVYkr6q1qlK1biS/HUyBe4EcA4Jc6bPRzdeVeAxdh5+DByc8yD/7/xNHBwdmbxN+Br6E2x6/zeeGNRORskMts2IZBVmxDU//XHzR9s+ln+NE8nE4DxUrhRJQIYjgCiEAHPnvkat6mPb92vPCshe4rvx1BP4jkOjt0Qx6dxCPTH7kqrYrImIltcyKJRRkxXY8NU3pJUHZNE2a3dqMXsN7cf1t1wOuGd2+n/49CesSrvrhmvdoTvMeza96O1JEmt5WxOM0na2UCn2Wi89w586sE4TKDn0IihRLcaazVTcD8Th9houIiIinKMyKRynIioiIiCcpzIrHKMiKT1LXACkJ7TciHqMwKx6hICs+TcFESkL7jYhHaDQDcRsFWJFiULAREXELtcyKWyjIihSDgqyIiNsozMpVU5CVMkmBVEpC+42I2ynMylVRkJUyTcFESkL7jYhbKcxKiSnIioiIiNUUZqVEFGRFRETEG2g0AykShVeRy+g7r3gHiH5iFij+fiMil2Vpy+z48eNp3bo1ISEhREZGctddd5GQkFDo/VatWkXLli0JDAykbt26TJ06tRSqLbv0eWtfJ5JPsPgfi5n97Gx+/PePZJ/Ptrok31TUgKogKxfT/iDiFpa2zK5atYphw4bRunVrsrOzefHFF+nWrRs7duwgODi4wPvs27ePXr16MXjwYGbPns3atWsZOnQoVatW5d577y3lZ+D7FGTta92X63jvz+9h+ps4qjnIeTOHms1r8sp3rxBaJdTq8kRERNzC0jD77bff5rk+c+ZMIiMj2bRpE506dSrwPlOnTiUmJoZJkyYB0LBhQ+Li4pg4caLCrJspyNpXakoq7z34Hjn35MCHkBOaAxsguXcys0bM4qlPn7K6RBEREbfwqhPAUlNTAQgPD7/sOuvXr6dbt255lnXv3p24uDjOnz+fb/3MzEzS0tLyXOTy5vX94yL2tf7L9ZhOE94HLjTC3gjmKJP1X64n62yWleX5Jv1kLCJiCa8Js06nk5EjR9KhQweaNGly2fWOHj1KtWrV8iyrVq0a2dnZHDt2LN/648ePJywsLPdSs2ZNt9fuKxRgfUf6iXSMEAMqX3JDLcjJyiEzI9OSunyeAq2ISKnzmjD7xBNPsHXrVj7//PNC1zUMI891p9NZ4HKA0aNHk5qamns5ePCgewr2MQqyvqVBhwaYx024uCePE/gUqjeoTsXwilaVVnYp6IqIeIRXDM315JNPsmTJElavXk2NGjWuuG716tU5evRonmUpKSn4+/sTERGRb/2AgAACAgLcWq+vUZD1PY27NKZhl4Yk9E3AfNKEa8GYa+Bc7qT/l/0L/MdPPEhBVkTEYywNs06nkyeffJKFCxcSGxtLnTp1Cr1P27Zt+eqrr/IsW758Oa1ataJcuXKeKtWnKLz6PsMwGL1kNF+89AXff/A9mWmZ1GhWg/sX3M+Nd99odXm+7dLxQxVkRUQ8ynBe+I3eAkOHDmXOnDksXryY+vXr5y4PCwsjKCgIcHUTSE5O5pNPPgFcQ3M1adKEIUOGMHjwYNavX89jjz3G559/XqTRDNLS0ggLCyN11ixCK1TwzBPzYgqyZY9pmuScz6FcgP7ZE/E6+lAWKVBGRhoDB4aRmppKaOiVh5O0tM/slClTSE1NpXPnzkRFReVe5s6dm7vOkSNHSEpKyr1ep04dvvnmG2JjY2nevDl///vfeffddzUsVxHoM7NscjgcCrIiIuKzLO9mUJhZs2blW3bzzTezefNmD1TkuxRkRURExBd5zWgG4jkKsiIiIuKrFGZ9nIKsiIiI+DKFWR+mICsiIiK+TmHWRynIioiISFmgMOuDFGRFRGxC4xCLXDWFWR+jICsiYjMKtCJXRWHWhyjIiojYlAKtSIkpzPoIBVkREREpixRmfYCCrIiIiJRVCrM2pyArIuIj1NVApEQUZm1MQVZExMco0IoUm8KsTSnIioiIiCjM2pKCrIiIiIiLwqyNzOurICsi4vPU1UCkWBRmbUIhVkSkDFGgFSkyhVkbUJAVERERKZjCrJdTkBURERG5PIVZL6YgKyJShqmrgUiRKMx6KQVZERFRoBUpnMKsF1KQFRERESkahVkvoyArIiIiUnQKs15EQVZERPJRVwORK1KY9RIKsiIiclkKtCKXpTDrBRRkRUSkUAq0IgVSmLWYgqyIiIhIySnMWkhBVkREROTqKMxaREFWRESKTV0NRPJRmLWAgqyIiJSYAq1IHgqzpUxBVkRERMR9FGZLkYKsiIiIiHspzJYSBVkREXEbdTUQyaUw62Hz+irIioiIByjQigAKsx6lECsiIiLiWQqzHqIgKyIiIuJ5CrMeoCArIiKlQl0NRBRm3U1BVkRESpUCrZRxCrNupCArIiIiUroUZt1EQVZERESk9CnMuoGCrIiIWEpdDaQMU5i9SgqyIiLiFRRopYxSmL0KCrIiIiIi1lKYLSEFWRERERHrWRpmV69eTZ8+fYiOjsYwDBYtWnTF9WNjYzEMI99l165dpVPw7xRkRUTEK6mrgZRBlobZM2fO0KxZMyZPnlys+yUkJHDkyJHcy7XXXuuhCvNTkBUREa+mQCtljL+VD96zZ0969uxZ7PtFRkZSqVIl9xdUCAVZERGxhb7z9KUlZYYt+8y2aNGCqKgounbtysqVK6+4bmZmJmlpaXkuJaHPBBERERHvY6swGxUVxbRp05g/fz4LFiygfv36dO3aldWrV1/2PuPHjycsLCz3UrNmzWI/roKsiIiIiHcynE6n0+oiAAzDYOHChdx1113Ful+fPn0wDIMlS5YUeHtmZiaZmZm519PS0qhZsyaps2YRWqFCodtXkBUREdvSl5jYVEZGGgMHhpGamkpoaOgV17VVy2xB2rRpQ2Ji4mVvDwgIIDQ0NM+lqPQZICIitqaTwaQMsH2Y3bJlC1FRUW7froKsiIiIiPezdDSD9PR09uzZk3t93759xMfHEx4eTkxMDKNHjyY5OZlPPvkEgEmTJlG7dm0aN25MVlYWs2fPZv78+cyfP99tNSnEioiIiNiHpWE2Li6OLl265F4fOXIkAA899BCzZs3iyJEjJCUl5d6elZXFqFGjSE5OJigoiMaNG/P111/Tq1cvt9SjICsiIj5Hw3SJj/OaE8BKS1paGmFhYflOANNxLiIiPk1fdGIjZeoEMHfQ8S0iIiJiT2U+zCrIioiIiNhXmQ6zCrIiIlJmaJgu8VFlNswuvNvqCkREREqZAq34oDIbZkVERETE/hRmRURERMS2FGZFRETKEnU1EB+jMCsiIlLWKNCKD1GYFRERKYsUaMVHKMyKiIiIiG0pzIqIiIiIbSnMioiIlFXqaiA+QGFWRESkLFOgFZtTmBURERER21KYFRERERHbUpgVEREp69TVQGxMYVZEREQUaMW2FGZFRERExLYUZkVERETEthRmRURExEVdDcSGFGZFRETkDwq0YjMKsyIiIiJiWwqzIiIiImJbCrMiIiKSl7oaiI0ozIqIiEh+CrRiEwqzIiIiImJbCrMiIiIiYlsKsyIiIlIwdTUQG1CYFRERkctToBUvpzArIiIiV6ZAK15MYVZEREREbEthVkRERERsS2FWRERECqeuBuKlFGZFRESkaBRoxQspzIqIiIiIbSnMioiIiIhtKcyKiIhI0amrgXgZhVkREREpHgVa8SIKsyIiIiJiWwqzIiIiImJbCrMiIiJSfOpqIF5CYVZERERKRoFWvIClYXb16tX06dOH6OhoDMNg0aJFhd5n1apVtGzZksDAQOrWrcvUqVM9X6iIiIiIeCVLw+yZM2do1qwZkydPLtL6+/bto1evXnTs2JEtW7bwwgsv8NRTTzF//nwPVyoiIiIi3sjfygfv2bMnPXv2LPL6U6dOJSYmhkmTJgHQsGFD4uLimDhxIvfee6+HqhQREZHL6jsP5vW1ugopwywNs8W1fv16unXrlmdZ9+7dmTFjBufPn6dcuXL57pOZmUlmZmbu9dTUVADOpp31bLEiIiJlRfePYeHdVlchPuTs2TQAnE5noevaKswePXqUatWq5VlWrVo1srOzOXbsGFFRUfnuM378eF599dV8yx+v+bjH6hQRESl7BlpdgPig06dPExYWdsV1bBVmAQzDyHP9QmK/dPkFo0ePZuTIkbnXTdPkxIkTREREXPY+kl9aWho1a9bk4MGDhIaGWl2OFIPeO/vSe2dvev/sS++d9ZxOJ6dPnyY6OrrQdW0VZqtXr87Ro0fzLEtJScHf35+IiIgC7xMQEEBAQECeZZUqVfJUiT4vNDRUB7ZN6b2zL7139qb3z7703lmrsBbZC2w1zmzbtm357rvv8ixbvnw5rVq1KrC/rIiIiIj4NkvDbHp6OvHx8cTHxwOuobfi4+NJSkoCXF0EHnzwwdz1H3vsMQ4cOMDIkSPZuXMnH330ETNmzGDUqFFWlC8iIiIiFrO0m0FcXBxdunTJvX6hb+tDDz3ErFmzOHLkSG6wBahTpw7ffPMNI0aM4P333yc6Opp3331Xw3KVgoCAAF555ZV8XTbE++m9sy+9d/am98++9N7Zi+EsypgHIiIiIiJeyFZ9ZkVERERELqYwKyIiIiK2pTArIiIiIralMCsiIiIitqUwK0U2fvx4DMPg6aeftroUKYIxY8ZgGEaeS/Xq1a0uS4ooOTmZBx54gIiICCpUqEDz5s3ZtGmT1WVJIWrXrp3vuDMMg2HDhlldmhQiOzubl156iTp16hAUFETdunV57bXXME3T6tKkELaaAUyss3HjRqZNm8b1119vdSlSDI0bN2bFihW51/38/CysRorq5MmTtG/fni5durBs2TIiIyP573//q9kLbWDjxo3k5OTkXv/ll1+47bbb6Nu3r4VVSVFMmDCBqVOn8vHHH9O4cWPi4uJ4+OGHCQsLY/jw4VaXJ1egMCuFSk9PZ8CAAUyfPp2xY8daXY4Ug7+/v1pjbWjChAnUrFmTmTNn5i6rXbu2dQVJkVWtWjXP9TfeeIN69epx8803W1SRFNX69eu58847uf322wHXMff5558TFxdncWVSGHUzkEINGzaM22+/nVtvvdXqUqSYEhMTiY6Opk6dOvTr14+9e/daXZIUwZIlS2jVqhV9+/YlMjKSFi1aMH36dKvLkmLKyspi9uzZDBo0CMMwrC5HCtGhQwe+//57du/eDcDPP//MmjVr6NWrl8WVSWHUMitX9MUXX7B582Y2btxodSlSTDfddBOffPIJ1113Hb/++itjx46lXbt2bN++nYiICKvLkyvYu3cvU6ZMYeTIkbzwwgts2LCBp556ioCAgDxTfIt3W7RoEadOnWLgwIFWlyJF8Nxzz5GamkqDBg3w8/MjJyeHcePG0b9/f6tLk0IozMplHTx4kOHDh7N8+XICAwOtLkeKqWfPnrl/N23alLZt21KvXj0+/vjj3KmjxTuZpkmrVq14/fXXAWjRogXbt29nypQpCrM2MmPGDHr27El0dLTVpUgRzJ07l9mzZzNnzhwaN25MfHw8Tz/9NNHR0Tz00ENWlydXoDArl7Vp0yZSUlJo2bJl7rKcnBxWr17N5MmTyczM1AlFNhIcHEzTpk1JTEy0uhQpRFRUFI0aNcqzrGHDhsyfP9+iiqS4Dhw4wIoVK1iwYIHVpUgRPfPMMzz//PP069cPcDUCHDhwgPHjxyvMejmFWbmsrl27sm3btjzLHn74YRo0aMBzzz2nIGszmZmZ7Ny5k44dO1pdihSiffv2JCQk5Fm2e/duatWqZVFFUlwzZ84kMjIy92Qi8X4ZGRk4HHlPJfLz89PQXDagMCuXFRISQpMmTfIsCw4OJiIiIt9y8T6jRo2iT58+xMTEkJKSwtixY0lLS1MLgw2MGDGCdu3a8frrr/OnP/2JDRs2MG3aNKZNm2Z1aVIEpmkyc+ZMHnroIfz99TVrF3369GHcuHHExMTQuHFjtmzZwttvv82gQYOsLk0KoaNMxEcdOnSI/v37c+zYMapWrUqbNm348ccf1bpnA61bt2bhwoWMHj2a1157jTp16jBp0iQGDBhgdWlSBCtWrCApKUkhyGbee+89Xn75ZYYOHUpKSgrR0dEMGTKEv/3tb1aXJoUwnE6n0+oiRERERERKQuPMioiIiIhtKcyKiIiIiG0pzIqIiIiIbSnMioiIiIhtKcyKiIiIiG0pzIqIiIiIbSnMioiIiIhtKcyKiIiIiG0pzIqIiIiIbWk6WxERL7Ru3TqGDh1a4G09evQgLi6OY8eOFXj7hg0bKF++PNOmTWPOnDls3ryZ06dPc/LkSSpVquTBqkVESp/CrIiIF0pLS+Ouu+5izJgxeZbv37+f559/nvT0dOLj4/Pdr3PnzpimCUBGRgY9evSgR48ejB49uhSqFhEpfQqzIiI+6umnnwYgNjbW0jpERDxJfWZFRERExLYUZkVERETEthRmRURERMS2FGZFRERExLYUZkVERETEtjSagYiIjzp69ChHjx5lz549AGzbto2QkBBiYmIIDw+3uDoREfdQy6yIiI+aOnUqLVq0YPDgwQB06tSJFi1asGTJEosrExFxH4VZEREfNWbMGJxOZ77LwIEDrS5NRMRtFGZFRERExLbUZ1ZExAuFhYWxdOlSli5dmu+27t27c+rUKVq1alXgfR0OtVOISNlhOJ1Op9VFiIiIiIiUhP59FxERERHbUpgVEREREdtSmBURERER21KYFRERERHbUpgVEREREdtSmBURERER21KYFRERERHbUpgVEREREdv6f7KzeE9MNygOAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 800x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.datasets import load_iris\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.metrics import accuracy_score\n",
    "from matplotlib.colors import ListedColormap\n",
    "\n",
    "# 加载数据集\n",
    "iris = load_iris()\n",
    "X = iris.data[:, :2]  # 为了便于可视化，只选取前两个特征\n",
    "y = iris.target\n",
    "\n",
    "# 拆分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n",
    "\n",
    "# 创建KNN分类器，选择K值为3\n",
    "knn = KNeighborsClassifier(n_neighbors=3)\n",
    "knn.fit(X_train, y_train)\n",
    "\n",
    "# 进行预测\n",
    "y_pred = knn.predict(X_test)\n",
    "\n",
    "# 评估准确率\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(f\"分类准确率: {accuracy:.2f}\")\n",
    "\n",
    "# 创建网格以可视化决策边界\n",
    "x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n",
    "y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n",
    "xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),\n",
    "                     np.arange(y_min, y_max, 0.02))\n",
    "\n",
    "# 预测网格中的每个点\n",
    "Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "Z = Z.reshape(xx.shape)\n",
    "\n",
    "# 绘制决策边界\n",
    "plt.figure(figsize=(8, 6))\n",
    "cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])\n",
    "cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])\n",
    "\n",
    "plt.contourf(xx, yy, Z, cmap=cmap_light)\n",
    "\n",
    "# 绘制训练集和测试集点\n",
    "plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_bold, edgecolor='k', s=20, label='训练集')\n",
    "plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cmap_bold, edgecolor='k', s=50, marker='*', label='测试集')\n",
    "\n",
    "plt.title(f\"KNN 分类决策边界 (K=3), 准确率: {accuracy:.2f}\")\n",
    "plt.xlabel('特征1')\n",
    "plt.ylabel('特征2')\n",
    "plt.legend()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#knn分类模型所需要的api\n",
    "# LinearRegression 线性回归的api\n",
    "from sklearn.multiclass import OneVsOneClassifier#多分类模型输出\n",
    "from sklearn.linear_model import LogisticRegression#实现逻辑回归\n",
    "from sklearn.datasets import make_multilabel_classification\n",
    "from sklearn.model_selection import train_test_split\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "X,y = make_multilabel_classification(n_samples=100,n_features=5,n_classes=3,n_labels=2,random_state=42)#生成多分类输出的分类数据\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-4 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-4 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-4 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-4 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-4 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-4 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-4 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-4 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-4 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-4 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-4 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-4 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-4\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>OneVsRestClassifier(estimator=LogisticRegression())</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-10\" type=\"checkbox\" ><label for=\"sk-estimator-id-10\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;OneVsRestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.multiclass.OneVsRestClassifier.html\">?<span>Documentation for OneVsRestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>OneVsRestClassifier(estimator=LogisticRegression())</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-11\" type=\"checkbox\" ><label for=\"sk-estimator-id-11\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">estimator: LogisticRegression</label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression()</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-12\" type=\"checkbox\" ><label for=\"sk-estimator-id-12\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;LogisticRegression<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression()</pre></div> </div></div></div></div></div></div></div></div></div>"
      ],
      "text/plain": [
       "OneVsRestClassifier(estimator=LogisticRegression())"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "model = OneVsRestClassifier(LogisticRegression())#多分类输出\n",
    "model.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 0 0]\n",
      " [1 1 0]\n",
      " [0 1 1]\n",
      " [1 1 0]\n",
      " [0 1 0]\n",
      " [0 1 0]\n",
      " [0 1 1]\n",
      " [1 1 0]\n",
      " [1 0 0]\n",
      " [0 1 0]\n",
      " [1 1 0]\n",
      " [1 1 1]\n",
      " [0 0 1]\n",
      " [1 0 0]\n",
      " [1 0 1]\n",
      " [0 1 1]\n",
      " [1 1 1]\n",
      " [1 0 0]\n",
      " [0 0 0]\n",
      " [1 0 0]]\n"
     ]
    }
   ],
   "source": [
    "\n",
    "y_pred = model.predict(X_test)\n",
    "\n",
    "print(y_pred)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
